更新文档中的数组
Overview
在本指南中,您可以了解如何使用 MongoDB Kotlin 驱动程序更新文档中的数组。
要更新数组,必须执行以下操作:
指定要执行的更新
指定要应用更新的数组元素
使用这些规范执行更新操作
文档样本
以下各节提供更新此样本文档的示例:
{ "_id": 1, "color": "green", "qty": [8, 12, 18] }
此数据使用以下 Kotlin 数据类进行建模:
data class PaintOrder( val id: Int, val qty: List<Int>, val color: String )
本页上的示例使用MongoCollection
类的 findOneAndUpdate()
方法检索和更新文档。 每个示例都使用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 对象的属性访问语法。
有关更多信息,请参阅有关MongoDB Server 点表示法 的 手册条目。
第一个匹配的数组元素
要更新与查询筛选器匹配的第一个数组元素,请使用位置$
运算符。数组字段必须显示为查询筛选器的一部分才能使用位置$
运算符。
例子
下列示例执行以下操作:
查询
qty
字段包含值“18”的文档将文档中与查询筛选器匹配的第一个数组值递减“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 文档