文档菜单
文档首页
/ / /
Go 驱动程序
/ / /

修改文档

本页内容

  • 概述
  • 关于_id
  • 更新
  • 参数
  • 返回值
  • 替换
  • 参数
  • 返回值
  • 更多信息
  • API 文档

在本指南中,您可以学习如何使用 更新替换 操作来修改 MongoDB 中的文档。

更新操作会更改您指定的字段,同时保留其他字段和值不变。替换操作会删除文档中除 _id 以外的所有字段,并用您指定的新字段和值替换被删除的字段。

在 MongoDB 中,所有修改文档的方法都遵循相同的模式

Change method signature

注意

占位符

changeX 是一个占位符,不是一个真实的方法。

该模式期望您

  • 指定一个查询过滤器以匹配一个或多个要修改的文档。

  • 指定字段和值更改。

  • 指定选项,如果您必须修改方法行为。

驱动程序提供了以下修改文档的方法

  • UpdateByID()

  • UpdateOne()

  • UpdateMany()

  • ReplaceOne()

  • BulkWrite() (本指南未讨论)

  • FindOneAndUpdate() (本指南未讨论)

  • FindOneAndReplace() (本指南未讨论)

在 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 文档

返回

删除