修改文档
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
指定带有条件的查询筛选器,以匹配集合中要更新的文档updateDocument
指定一个或多个匹配文档中要修改的字段和值。 在本示例中,我们使用更新构建器来创建更新文档。
您可以使用Updates
构建器创建updateDocument
,如下所示:
val updateDocument = Updates.operator(field, value)
有关 更新构建器及其用法的完整列表,请参阅 MongoDB API 文档。
例子
客户退回一罐黄色油漆后,油漆商店需要更新库存。
要更新该单罐油漆,请调用 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
然后,油漆店收到新的货物,需要再次更新库存。 这批货物包含每种油漆颜色 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
对象的字段和值
例子
油漆店意识到他们需要再次更新库存。 他们以为是 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()
不会对集合中的文档进行任何更改。 请参阅我们的更新或插入指南,了解如何在没有匹配的文档时插入新文档而不是替换文档。
如果多个文档与 replaceOne()
方法中指定的查询过滤器匹配,则替换第一个结果。
重要
replaceOne()
方法无法对违反集合唯一索引约束的文档进行更改。 有关唯一索引的更多信息,请参阅MongoDB服务器手册。