修改文档
概述
在本指南中,您可以学习如何使用 更新 和 替换 操作来修改 MongoDB 中的文档。
更新操作会更改您指定的字段,同时保留其他字段和值不变。替换操作会删除文档中除 _id
以外的所有字段,并用您指定的新字段和值替换被删除的字段。
在 MongoDB 中,所有修改文档的方法都遵循相同的模式

注意
占位符
changeX
是一个占位符,不是一个真实的方法。
该模式期望您
指定一个查询过滤器以匹配一个或多个要修改的文档。
指定字段和值更改。
指定选项,如果您必须修改方法行为。
驱动程序提供了以下修改文档的方法
UpdateByID()
UpdateOne()
UpdateMany()
ReplaceOne()
BulkWrite()
(本指南未讨论)FindOneAndUpdate()
(本指南未讨论)FindOneAndReplace()
(本指南未讨论)
关于 _id
的说明
在 MongoDB 集合中的每个文档都有一个唯一且不可变的 _id
字段。您不能使用更新和替换操作来更改 _id
字段。如果您尝试更改此字段,更新和替换方法将返回一个 WriteError
。
更新
使用 UpdateOne()
或 UpdateByID()
方法来更新单个文档。
使用 UpdateMany()
方法来更新多个文档。
参数
每个方法都接受一个 更新文档,该文档至少包含一个 更新运算符。更新运算符指定要执行更新的类型。更新文档还包含描述更改的字段和值。更新文档使用以下格式
bson.D{{"<update operator>", bson.D{{"<field>", <value>}, {"<field>", <value>}, ... }}, {"<update operator>", ... }, ... }
有关完整列表和描述,请参阅 MongoDB 服务器手册更新运算符.
注意
更新操作中的聚合管道
如果您使用的是 MongoDB 服务器版本 4.2 或更高版本,您可以在更新操作中使用由聚合阶段子集组成的聚合管道。有关 MongoDB 在聚合管道中支持的聚合阶段的信息,请参阅我们关于使用 聚合管道更新 的教程。
返回值
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>"}, ... }
返回值
ReplaceOne()
返回一个包含替换操作信息(如果操作成功)的UpdateResult
类型。该类型包含以下属性
属性 | 描述 |
---|---|
MatchedCount | 匹配过滤器文档的数量 |
ModifiedCount | 操作修改的文档数量 |
UpsertedCount | 操作插入的文档数量 |
UpsertedID | 插入文档的 _id ,如果没有则为 nil |
如果多个文档匹配传递给ReplaceOne()
的查询过滤器,则该方法选择并替换第一个匹配的文档。如果没有任何文档匹配查询过滤器,替换操作将失败。
示例
以下文档描述了一个厨房用品
{ "_id" : 2056, "item" : "Mug", "brand" : "Simply Ceramics", "price" : 2.99, "material" : "Glass" }
以下示例使用ReplaceOne()
方法将此文档替换为包含item
字段值为"Cup"和quantity
字段值为107的文档
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 文档