文档菜单
文档首页
/ / /
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)

每个文档包含一本书的描述,包括标题、作者和对应于每个文档中titleauthorlength字段的页数。

提示

不存在的数据库和集合

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

要执行批量操作,将一个文档的数组传递给 BulkWrite() 方法。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 来替换标题为 "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()
如果 查询过滤器 不匹配任何文档,则是否插入新文档。

以下示例创建了一个 UpdateOneModel,如果文档的 author 是 "Elena Ferrante",则将文档的 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 来删除长度大于 300 的文档。

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

BulkWrite() 方法允许您在 BulkWriteOptions 中指定是否要按顺序或无序执行批量操作。

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

提示

这等价于在 SetOrdered() 方法中指定 true

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

要无序执行批量写操作并在发生错误时继续,请将 false 指定给 SetOrdered() 方法。该方法之后报告错误。

以下示例以任何顺序执行以下操作:

  • 插入两个文档。

  • 将标题为 "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)
Number of documents inserted: 2
Number of documents replaced or updated: 2
Number of documents deleted: 1

在批量操作后,以下文档存在于 books 集合中

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

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

要了解更多关于执行所提及的操作的信息,请参阅以下指南

要了解更多关于本指南中讨论的任何方法或类型的信息,请参阅以下 API 文档

返回

更新/插入