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

批量操作

在此页面上

  • 概述
  • 样本数据
  • 批量写入
  • 修改行为
  • 返回值
  • 操作
  • 插入
  • 替换
  • 更新
  • 删除
  • 执行顺序
  • 已排序
  • 无序
  • 更多信息
  • 相关操作
  • API 文档

在本指南中,您可以学习如何使用批量操作

批量操作执行大量写操作。批量操作无需每次操作都调用数据库,只需调用数据库一次即可执行多个操作。

本部分的示例使用以下 Book 结构作为 books 集合中文档的模型:

type Book struct {
Title string
Author string
Length int32
}

要运行本部分中的示例,请使用以下代码段将样本数据加载到 db.books 集合中:

coll := client.Database("db").Collection("books")
docs := []interface{}{
Book{Title: "My Brilliant Friend", Author: "Elena Ferrante", Length: 331},
Book{Title: "Lucy", Author: "Jamaica Kincaid", Length: 103},
}
result, err := coll.InsertMany(context.TODO(), docs)

每个文档都包含书籍说明,其中包含与每个文档中的 title(名称)、author(作者)和 length(长度)字段对应的名称、作者和页面长度。

提示

不存在的数据库和集合

如果执行写操作时不存在必要的数据库和集合,服务器会隐式创建这些数据库和集合。

要执行批量操作,请将 WriteModel文档数组传递给BulkWrite()方法。

BulkWrite() 方法可以选择采用 BulkWriteOptions 类型,该类型表示可用于修改其行为的选项。如果不指定 BulkWriteOptions,则驱动程序将使用每个选项的默认值。

BulkWriteOptions 类型允许您使用以下方法配置选项:

方法
说明
SetBypassDocumentValidation()
是否允许写入选择退出文档级验证。
默认: false
SetOrdered()
在发生错误之后是否停止执行写入操作。
默认: true

如果批量操作成功,则 BulkWrite() 方法返回 BulkWriteResult 类型,其中包含批量操作的相关信息。BulkWriteResult 类型包含以下属性:

属性
说明
InsertedCount
插入的文档数量。
MatchedCount
在更新和替换操作中与查询筛选器匹配的文档数量。
ModifiedCount
通过更新和替换操作修改的文档数量。
DeletedCount
删除的文档数量。
UpsertedCount
通过更新和替换操作更新或插入的文档数量。
UpsertedIDs
操作索引到每个更新或插入文档的 _id 的映射。

WriteModel 表示一个插入、替换、更新或删除操作。

要执行插入操作,请创建 InsertOneModel,以指定要插入的文档。要插入多个文档,请为要插入的每个文档创建 InsertOneModel

InsertOneModel 允许使用以下方法指定其行为:

方法
说明
SetDocument()
要插入的文档。

以下示例会创建两个 InsertOneModel 实例以插入两个文档:

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Beloved", Author: "Toni Morrison", Length: 324}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Outline", Author: "Rachel Cusk", Length: 258}),
}

要执行替换操作,请创建 ReplaceOneModel,指定待替换文档和替换文档。要替换多个文档,请为每个待替换文档创建一个 ReplaceOneModel

ReplaceOneModel 允许使用以下方法指定它的行为:

方法
说明
SetCollation()
对结果进行排序时要使用的语言排序规则类型。
SetFilter()
查询筛选器,指定要替换的文档。
SetHint()
用于扫描文档的索引。
SetReplacement()
要替换匹配的文档的文档。
SetUpsert()
如果查询筛选器不匹配任何文档,是否插入新文档。

以下示例创建 ReplaceOneModel,以将 title 为“Lucy”的文档替换为新文档:

models := []mongo.WriteModel{
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "Lucy"}}).
SetReplacement(Book{Title: "On Beauty", Author: "Zadie Smith", Length: 473}),
}

要执行更新操作,请创建一个指定要更新文档的 UpdateOneModel更新文档。要更新多个文档,请使用 UpdateManyModel

UpdateOneModelUpdateManyModel 允许您使用以下方法指定它们的行为:

方法
说明
SetArrayFilters()
更新应用到的数组元素。
SetCollation()
对结果进行排序时要使用的语言排序规则类型。
SetFilter()
查询筛选器,指定要更新的文档。
SetHint()
用于扫描文档的索引。
SetUpdate()
要应用到匹配文档的修改。
SetUpsert()
如果查询筛选器不匹配任何文档,是否插入新文档。

如果 author(作者)是“Elena Ferrante”,如下示例将创建一个 UpdateOneModel,以便将一个文档的 length(长度)递减 15

models := []mongo.WriteModel{
mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}),
}

要执行删除操作,请创建一个 DeleteOneModel,以指定要删除的文档。要删除多个文档,请使用 DeleteManyModel

DeleteOneModelDeleteManyModel 允许您使用以下方法指定它们的行为:

方法
说明
SetCollation()
对结果进行排序时要使用的语言排序规则类型。
SetFilter()
查询筛选器,指定要删除的文档。
SetHint()
用于扫描文档的索引。

以下示例创建了一个 DeleteManyModel,用于删除 length 大于 300 的文档:

models := []mongo.WriteModel{
mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}),
}

BulkWrite() 方法支持您在 BulkWriteOptions 中指定以有序方式还是无序方式执行批量操作。

默认情况下,BulkWrite() 方法按照您添加的顺序执行批量操作,并在出现错误时停止执行。

提示

这相当于在 SetOrdered() 方法中指定 true

opts := options.BulkWrite().SetOrdered(true)

要按任意顺序执行批量写入操作并在发生错误时继续,请为 SetOrdered()方法指定 false。随后,此方法将报告错误。

以下示例按任意顺序执行以下动作:

  • 插入两个文档。

  • title 为“My Brilliant Friend”的文档替换为新文档。

  • 如果当前的 length(长度)值小于 200,则将每个文档的 length(长度)值递增 10

  • 删除 author 字段值包含“Jam”的所有文档。

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Middlemarch", Author: "George Eliot", Length: 904}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Pale Fire", Author: "Vladimir Nabokov", Length: 246}),
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "My Brilliant Friend"}}).
SetReplacement(Book{Title: "Atonement", Author: "Ian McEwan", Length: 351}),
mongo.NewUpdateManyModel().SetFilter(bson.D{{"length", bson.D{{"$lt", 200}}}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", 10}}}}),
mongo.NewDeleteManyModel().SetFilter(bson.D{{"author", bson.D{{"$regex", "Jam"}}}}),
}
opts := options.BulkWrite().SetOrdered(false)
results, err := coll.BulkWrite(context.TODO(), models, opts)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount)
fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount)
fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)

批量操作后,books(图书)集合中存在以下文档:

{"title":"Atonement","author":"Ian McEwan","length":351}
{"title":"Middlemarch","author":"George Eliot","length":904}
{"title":"Pale Fire","author":"Vladimir Nabokov","length":246}

有关执行批量操作的可运行示例,请参阅执行批量操作

要了解有关执行上述操作的更多信息,请参阅以下指南:

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

← 在单个操作中插入或更新