在文档中更新数组
概述
在本指南中,您将学习如何使用MongoDB Kotlin驱动程序更新文档中的数组。
要更新数组,您必须执行以下操作
指定要执行的操作更新
指定要应用更新的数组元素
使用这些规范执行更新操作
示例文档
以下部分包含更新此示例文档的示例
{ "_id": 1, "color": "green", "qty": [8, 12, 18] }
该数据使用以下Kotlin数据类建模
data class PaintOrder( val id: Int, val qty: List<Int>, val color: String )
本页面的示例使用findOneAndUpdate()
方法来检索和更新文档,该方法是 MongoCollection
类的。每个示例都使用 FindOneAndUpdateOptions
类的一个实例来在更新后从MongoDB检索文档。有关 findOneAndUpdate()
方法的更多信息,请参阅我们的复合操作指南.
指定更新
要指定更新,请使用 Updates
构建器。该 Updates
构建器提供静态实用方法来构建更新规范。
有关使用 Updates
构建器与数组的相关信息,请参阅我们的 更新构建器指南。
以下示例执行以下操作
查询示例文档
将"17"添加到与查询过滤器匹配的文档中的
qty
数组
val filter = Filters.eq("_id", 1) val update = Updates.push(PaintOrder::qty.name, 17) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) print(result)
PaintOrder(id=1, qty=[8, 12, 18, 17], color=green)
指定数组元素
您可以使用位置操作符来指定要更新的数组元素。位置操作符可以指定第一个、所有或某些数组元素以更新。
要使用位置操作符指定数组中的元素,请使用点表示法。点表示法是导航BSON对象的属性访问语法。
有关更多信息,请参阅服务器手册条目点表示法.
第一个匹配的数组元素
要更新第一个与查询过滤器匹配的数组元素,请使用位置操作符$
。要使用位置操作符,数组字段必须作为查询过滤器的一部分出现。
示例
以下示例执行以下操作
查询包含值"18"的
qty
字段的文档将匹配查询过滤器的文档中的第一个数组值减去"3"。
val filter = Filters.eq(PaintOrder::qty.name, 18) val update = Updates.inc("${PaintOrder::qty.name}.$", -3) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) print(result)
PaintOrder(id=1, qty=[8, 12, 15], color=green)
有关本节中提到的方法和运算符的更多信息,请参阅以下资源
匹配所有数组元素
要更新数组中的所有元素,请使用所有位置 $[]
运算符。
示例
以下示例执行以下操作
查询示例文档
将匹配查询过滤器的数组元素乘以 "2"
val filter = Filters.eq("_id", 1) val update = Updates.mul("${PaintOrder::qty.name}.$[]", 2) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) println(result)
PaintOrder(id=1, qty=[16, 24, 36], color=green)
有关本节中提到的方法和运算符的更多信息,请参阅以下资源
所有位置 $[] 运算符 服务器手册条目
mul() API 文档
匹配多个数组元素
要更新匹配过滤器条件的数组元素,请使用过滤位置$[<identifier>]
运算符。您必须在更新操作中包含数组过滤器,以指定要更新的数组元素。
<identifier>
是您为数组过滤器提供的名称。此值必须以小写字母开头,并仅包含字母数字字符。
示例
以下示例执行以下操作
查询示例文档
设置数组过滤器以搜索小于 "15" 的值
将匹配查询过滤器的数组元素增加 "5"
val filter = Filters.eq("_id", 1) val smallerFilter = Filters.lt("smaller", 15) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) .arrayFilters(listOf(smallerFilter)) val update = Updates.inc("${PaintOrder::qty.name}.$[smaller]", 5) val result = collection.findOneAndUpdate(filter, update, options) println(result)
PaintOrder(id=1, qty=[13, 17, 18], color=green)
有关本节中提到的方法和运算符的更多信息,请参阅以下资源
过滤位置 $[<identifier>] 运算符 服务器手册条目
inc() API 文档