修改文档
Overview
在本指南中,您可以学习如何使用更新和替换操作修改 MongoDB 中的文档。
更新操作会更改您指定的字段,同时保持其他字段和值不变。替换操作删除文档中除 _id
之外的所有现有字段,并用您指定的新字段和值替换已删除的字段。
在 MongoDB 中,所有修改文档的方法都遵循相同的模式:
注意
占位符
changeX
是一个占位符,而不是一个真正的方法。
该模式希望您:
指定查询过滤以匹配要修改的一个或多个文档。
指定字段和值的变化。
如果必须修改方法行为,请指定选项。
驾驶员提供以下修改文档的方法:
UpdateByID()
UpdateOne()
UpdateMany()
ReplaceOne()
BulkWrite()
(本指南未讨论)FindOneAndUpdate()
(本指南未讨论)FindOneAndReplace()
(本指南未讨论)
关于以下项的说明: _id
MongoDB 集合中的每个文档都有一个唯一且不可变的 _id
字段。您不能使用更新和替换操作来更改 _id
字段。如果您尝试更改此字段,更新和替换方法将会返回 WriteError
。
Update
使用 UpdateOne()
或 UpdateByID()
方法更新单个文档。
使用UpdateMany()
方法更新多个文档。
参数
每种方法都采用包含至少一个更新操作符的更新文档。 更新操作符指定要执行的更新类型。 更新文档还包括描述更改的字段和值。更新文档使用以下格式:
bson.D{{"<update operator>", bson.D{{"<field>", <value>}, {"<field>", <value>}, ... }}, {"<update operator>", ... }, ... }
有关更新操作符和说明的完整列表,请参阅 MongoDB 服务器手册。
注意
更新操作中的聚合管道
如果您使用的是MongoDB Server 4.2或更高版本,则可以在更新操作中使用由聚合阶段子集组成的聚合管道。 要学习;了解有关MongoDB在聚合管道中支持的聚合阶段的更多信息,请参阅有关使用聚合管道执行更新的教程。
Return Values
UpdateOne()
、 UpdateByID()
和UpdateMany()
会在操作成功时返回UpdateResult
类型,其中包含有关更新操作的信息。 UpdateResult
类型包含以下属性:
属性 | 说明 |
---|---|
MatchedCount | 过滤匹配的文档数 |
ModifiedCount | 操作修改的文档数量 |
UpsertedCount | 该操作更新或插入的文档数量 |
UpsertedID | 更新或插入文档的 _id ,如果没有则为 nil |
如果多个文档与传递给 UpdateOne()
的查询过滤器匹配,则该方法将选择并更新第一个匹配的文档。如果没有与查询过滤器匹配的文档,更新操作不会进行更改。
请参阅我们的更新或更新或插入(upsert)指南,学习;了解如何在没有文档与查询过滤匹配的情况下插入新文档。
例子
以下文档描述了一名员工:
{ "_id" : 2158, "name" : "Mary Shelley", "department" : "Marketing", "role" : "Marketing Analyst", "bonus" : 2500, ... }
以下示例使用UpdateByID()
方法:
匹配
_id
值为 2158 的文档。将
name
字段设置为“Mary Wollstonecraft Shelley”,将role
字段设置为“Marketing Director”。将
bonus
字段的值增加 2000。
filter := bson.D{{"_id", 2158}} update := bson.D{{"$set", bson.D{{"name", "Mary Wollstonecraft Shelley"}, {"role", "Marketing Director"}}}, {"$inc", bson.D{{"bonus", 2000}}}} result, err := collection.UpdateOne(context.TODO(), filter, update) fmt.Printf("Documents matched: %v\n", result.MatchedCount) fmt.Printf("Documents updated: %v\n", result.ModifiedCount)
Documents matched: 1 Documents updated: 1
以下显示了前面的更新操作产生的更新文档:
{ "_id" : 2158, "name" : "Mary Wollstonecraft Shelley", "department" : "Marketing", "role" : "Marketing Director", "bonus" : 4500, ... }
替换
使用 ReplaceOne()
方法替换单个文档。
参数
ReplaceOne()
需要替换文档,即您要替换现有文档的文档。 替换文档使用以下格式:
bson.D{{"<field>", "<value>"}, {"<field>", "<value>"}, ... }
Return Values
ReplaceOne()
如果操作成功,则返回UpdateResult
类型,其中包含有关替换操作的信息。 UpdateResult
类型包含以下属性:
属性 | 说明 |
---|---|
MatchedCount | 过滤匹配的文档数 |
ModifiedCount | 操作修改的文档数量 |
UpsertedCount | 该操作更新或插入的文档数量 |
UpsertedID | 更新或插入文档的 _id ,如果没有则为 nil |
如果多个文档与传递给 ReplaceOne()
的查询过滤器匹配,则该方法将选择并替换第一个匹配的文档。如果没有文档与查询筛选器匹配,则替换操作将失败。
例子
以下文档描述了一种厨房用品:
{ "_id" : 2056, "item" : "Mug", "brand" : "Simply Ceramics", "price" : 2.99, "material" : "Glass" }
下面的示例使用 ReplaceOne()
方法将此文档替换为另一个文档,其中包含一个值为 "Cup" 的 item
字段和一个值为 107 的 quantity
字段:
filter := bson.D{{"_id", 2056}} replacement := bson.D{{"item", "Cup"}, {"quantity", 107}} result, err := collection.ReplaceOne(context.TODO(), filter, replacement) fmt.Printf("Documents matched: %v\n", result.MatchedCount) fmt.Printf("Documents replaced: %v\n", result.ModifiedCount)
Documents matched: 1 Documents replaced: 1
被替换文档包含替换文档的内容和不可变的 _id
字段,具体如下:
{ "_id" : 2056, "item" : "Cup", "quantity" : 107 }
更多信息
有关更新和替换操作的可运行示例,请参阅以下用法示例:
要了解有关提到的操作的更多信息,请参阅以下指南:
要了解有关更新数组元素的详细信息,请参阅更新文档中的数组。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: