批量操作
概述
在本指南中,您可以了解如何使用批量操作。
批量操作执行大量写操作。不是对数据库中的每个操作都进行一次调用,而是批量操作通过一次数据库调用执行多个操作。
示例数据
本指南中的示例使用以下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
字段的页数。
提示
不存在的数据库和集合
如果在执行写入操作时必要的数据库和集合不存在,服务器会隐式地创建它们。
批量写入
要执行批量操作,将一个文档的数组传递给 BulkWrite()
方法。WriteModel 文档传递给 BulkWrite()
方法。
修改行为
BulkWrite()
方法可以可选地接受一个 BulkWriteOptions
类型,该类型表示您可以使用它来修改其行为。如果您未指定 BulkWriteOptions
,则驱动程序会使用每个选项的默认值。
BulkWriteOptions
类型允许您使用以下方法配置选项
方法 | 描述 |
---|---|
SetBypassDocumentValidation() | 是否允许写入操作放弃文档级别的验证。 默认值: false |
SetOrdered() | 是否在发生错误后停止执行写入操作。 默认值: true |
返回值
BulkWrite()
方法返回一个 BulkWriteResult
类型,该类型包含关于批量操作成功时的信息。BulkWriteResult
类型包含以下属性:
操作
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
。
UpdateOneModel
和 UpdateManyModel
允许您使用以下方法指定其行为
方法 | 描述 |
---|---|
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
。
DeleteOneModel
和 DeleteManyModel
允许您使用以下方法指定其行为:
方法 | 描述 |
---|---|
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 文档
要了解更多关于本指南中讨论的任何方法或类型的信息,请参阅以下 API 文档