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

修改文档

在此页面上

  • 概述
  • 关于以下项的说明: _id
  • 更新
  • 参数
  • 返回值
  • 替换
  • 参数
  • 返回值
  • 更多信息
  • API 文档

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

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

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

更改方法签名

注意

占位符

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 Server 版本4 。 2或更高版本,可以在更新操作中使用由聚合阶段子集组成的聚合管道。要了解有关 MongoDB 在聚合管道中支持的聚合阶段的更多信息,请参阅有关使用聚合管道执行更新的教程。

UpdateOne()UpdateByID()UpdateMany()会在操作成功时返回UpdateResult类型,其中包含有关更新操作的信息。 UpdateResult类型包含以下属性:

属性
说明
MatchedCount
筛选器匹配的文档数
ModifiedCount
操作修改的文档数量
UpsertedCount
该操作更新或插入的文档数量
UpsertedID
更新或插入文档的 _id,如果没有则为 nil

如果多个文档与传递给 UpdateOne() 的查询过滤器匹配,则该方法将选择并更新第一个匹配的文档。如果没有与查询过滤器匹配的文档,更新操作不会进行更改。

请参阅我们的更新或插入指南,了解如何在没有文档与查询筛选器匹配的情况下插入新文档。

以下文档描述了一名员工:

{
"_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)

以下显示了前面的更新操作产生的更新文档:

{
"_id" : 2158,
"name" : "Mary Wollstonecraft Shelley",
"department" : "Marketing",
"role" : "Marketing Director",
"bonus" : 4500,
...
}

使用 ReplaceOne() 方法替换单个文档。

ReplaceOne() 需要替换文档,即您要替换现有文档的文档。 替换文档使用以下格式:

bson.D{{"<field>", "<value>"}, {"<field>", "<value>"}, ... }

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)

被替换文档包含替换文档的内容和不可变的 _id 字段,具体如下:

{
"_id" : 2056,
"item" : "Cup",
"quantity" : 107
}

有关更新和替换操作的可运行示例,请参阅以下用法示例:

要了解有关提到的操作的更多信息,请参阅以下指南:

要了解有关更新数组元素的详细信息,请参阅更新文档中的数组

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

← 删除文档