文档菜单
文档首页
/ / /
Kotlin 协程

在文档中更新数组

本页面内容

  • 概述
  • 示例文档
  • 指定更新
  • 指定数组元素
  • 匹配第一个数组元素
  • 匹配所有数组元素
  • 匹配多个数组元素

在本指南中,您将学习如何使用MongoDB Kotlin驱动程序更新文档中的数组。

要更新数组,您必须执行以下操作

  • 指定要执行的操作更新

  • 指定要应用更新的数组元素

  • 使用这些规范执行更新操作

以下部分包含更新此示例文档的示例

{ "_id": 1, "color": "green", "qty": [8, 12, 18] }

该数据使用以下Kotlin数据类建模

data class PaintOrder(
@BsonId 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)

有关本节中提到的方法和运算符的更多信息,请参阅以下资源

要更新匹配过滤器条件的数组元素,请使用过滤位置$[<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)

有关本节中提到的方法和运算符的更多信息,请参阅以下资源

下一页

MongoDB Kotlin 驱动