修改文档
Overview
在本指南中,您可以了解如何使用两种不同的操作类型修改 MongoDB 集合中的文档:
更新操作指定一个或多个文档中要更改的字段和值。替换操作指定用于替换collection中单个文档的字段和值。
在以下示例中,一家油漆店销售五种不同颜色的油漆。 paint_inventory
collection 表示其当前库存:
{ "_id": 1, "color": "red", "qty": 5 } { "_id": 2, "color": "purple", "qty": 8 } { "_id": 3, "color": "yellow", "qty": 0 } { "_id": 4, "color": "green", "qty": 6 } { "_id": 5, "color": "pink", "qty": 0 }
此数据使用以下 Kotlin 数据类进行建模:
data class PaintOrder( val id: Int, val color: String, val qty: Int )
Update
更新操作可以修改字段和值。 它们将更新文档中指定的更改应用于与查询筛选器匹配的一个或多个文档。
updateOne() 方法更改查询过滤匹配的第一个文档, updateMany() 方法更改查询过滤匹配的所有文档。
您可以在MongoCollection
实例上调用updateOne()
和updateMany()
方法,如下所示:
collection.updateOne(<query>, <updateDocument>) collection.updateMany(<query>, <updateDocument>)
更新操作参数
updateOne()
和updateMany()
方法均具有以下参数:
query
指定带有条件的查询筛选器,以匹配集合中要更新的文档(可选)
updateOptions
指定可设立用于自定义驾驶员执行更新操作方式的选项。要学习;了解有关此类型的更多信息,请参阅 UpdateOptions 的API文档。
您可以使用Updates
构建器创建updateDocument
,如下所示:
val updateDocument = Updates.operator(<field>, <value>)
更新一个示例
客户退回一罐黄色油漆后,油漆商店需要更新库存。
要更新该单罐油漆,请调用 updateOne()
方法并指定以下内容:
与黄色匹配的查询过滤
更新包含将
qty
字段递增1
的说明的文档
val filter = Filters.eq(PaintOrder::color.name, "yellow") val update = Updates.inc(PaintOrder::qty.name, 1) val result = collection.updateOne(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 1 Modified document count: 1
如果多个文档与 updateOne()
方法中指定的查询过滤匹配,则会更新第一个结果。您可以在 UpdateOptions
实例中指定排序,以便在驾驶员执行更新操作之前对匹配的文档应用,如以下代码所示:
val opts = UpdateOptions().sort(Sorts.ascending(PaintOrder::color.name))
更新许多示例
然后,油漆店收到新的货物,需要再次更新库存。 这批货物包含每种油漆颜色 20 罐。
要更新清单,请调用updateMany()
方法并指定以下内容:
匹配所有颜色的查询过滤
更新包含将
qty
字段递增20
的说明的文档
val filter = Filters.empty() val update = Updates.inc(PaintOrder::qty.name, 20) val result = collection.updateMany(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 5 Modified document count: 5
下面显示了paint_inventory
集合中更新后的文档:
{ "_id": 1, "color": "red", "qty": 25 } { "_id": 2, "color": "purple", "qty": 28 } { "_id": 3, "color": "yellow", "qty": 20 } { "_id": 4, "color": "green", "qty": 26 } { "_id": 5, "color": "pink", "qty": 20 }
如果更新操作中与查询过滤匹配的文档为零,则updateMany()
不会对集合中的文档进行任何更改。请参阅更新或插入指南,学习;了解如何在没有匹配的文档时插入新文档而不是更新文档。
重要
updateOne()
和updateMany()
方法无法对违反集合唯一索引约束的文档进行更改。 有关唯一索引的更多信息,请参阅 MongoDB 服务器手册。
替换
替换操作会替换集合中的一个文档。 替换发生在查询筛选器匹配的文档和替换文档之间。
replaceOne() 方法会删除匹配文档中的所有现有字段和值(_id
字段除外),并用替换文档进行替换。
您可以在MongoCollection
实例上调用replaceOne()
方法,如下所示:
collection.replaceOne(<query>, <replacementDocument>)
替换操作参数
replaceOne()
方法具有以下参数:
query
指定带有条件的查询筛选器,以匹配集合中要替换的文档replacementDocument
指定要在匹配文档中替换的新Document
对象的字段和值(可选)
replaceOptions
指定可设立的选项,以自定义驾驶员执行替换操作的方式。要学习;了解有关此类型的更多信息,请参阅 ReplaceOptions 的API文档。
替换一个示例
油漆店意识到他们需要再次更新库存。 他们以为是 20 罐粉红色油漆,实际上是 25 罐橙色油漆。
要更新清单,请调用replaceOne()
方法并指定以下内容:
匹配
color
为“粉红色”的文档的查询过滤color
为“orange”且qty
为“25”的替换文档
val filter = Filters.eq(PaintOrder::color.name, "pink") val update = PaintOrder(5, "orange", 25) val result = collection.replaceOne(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 1 Modified document count: 1
更新后的文档如下所示:
{ "_id": 5, "color": "orange", "qty": 25 }
如果多个文档与 replaceOne()
方法中指定的查询过滤匹配,则会替换第一个结果。您可以在 ReplaceOptions
实例中指定排序,以便在驾驶员执行替换操作之前对匹配的文档应用顺序,如以下代码所示:
val opts = ReplaceOptions().sort(Sorts.ascending(PaintOrder::color.name))
如果替换操作中与查询过滤匹配的文档有零个,则replaceOne()
不会对集合中的文档进行任何更改。请参阅更新或插入指南,学习;了解如何在没有匹配的文档时插入新文档而不是替换文档。
重要
replaceOne()
方法无法对违反集合唯一索引约束的文档进行更改。 有关唯一索引的更多信息,请参阅MongoDB服务器手册。