Docs 菜单
Docs 主页
/ / /
Go
/ / /

批量操作

在此页面上

  • Overview
  • 样本数据
  • 批量写入
  • 修改行为
  • Return Values
  • 操作
  • Insert
  • 替换
  • Update
  • 删除
  • 执行顺序
  • 已排序
  • 无序
  • 更多信息
  • 相关操作
  • 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()
Whether to allow the write to opt-out of document level validation.
Default: false
SetOrdered()
Whether to stop performing write operations after an error occurs.
Default: true

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

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

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

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

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

方法
说明
SetDocument()
The document to insert.

以下示例会创建两个 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()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to replace.
SetHint()
The index to use to scan for documents.
SetReplacement()
The document to replace the matched document with.
SetUpsert()
Whether to insert a new document if the query filter doesn't match any documents.

以下示例创建 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()
The array elements the update applies to.
SetCollation()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to update.
SetHint()
The index to use to scan for documents.
SetUpdate()
The modifications to apply on the matched documents.
SetUpsert()
Whether to insert a new document if the query filter doesn't match any documents.

如果 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()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to delete.
SetHint()
The index to use to scan for documents.

以下示例创建了一个 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 文档:

后退

在单个操作中插入或更新