批量()
提示
MongoDB 还提供了用于执行批量写操作的db.collection.bulkWrite()
方法。
描述
Bulk()
Bulk 操作构建器用于构建单个集合中要批量执行的一系列写操作。要实例化构建器,请使用
db.collection.initializeOrderedBulkOp()
或db.collection.initializeUnorderedBulkOp()
方法。
兼容性
此命令可在以下环境中部署的以下环境中使用
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
注意
此命令在所有 MongoDB Atlas 集群中受支持。有关 Atlas 对所有命令的支持信息,请参阅 不受支持的命令。
有序和无序批量操作
构建器可以将操作列表构建为 有序 或 无序。
有序操作
在有顺序的操作列表中,MongoDB会顺序执行列表中的写操作。如果在处理某个写操作期间发生错误,MongoDB将返回而不会处理列表中剩余的任何写操作。
使用db.collection.initializeOrderedBulkOp()
来创建一个有序写命令列表的构建器。
当执行一个有序
操作列表时,MongoDB将操作按操作类型
和连续性分组;即同一类型的连续操作会被分组在一起。例如,如果一个有序列表包含两个插入操作,然后是一个更新操作,然后是另一个插入操作,MongoDB将操作分为三个不同的组:第一个组包含两个插入操作,第二个组包含更新操作,第三个组包含最后一个插入操作。这种行为可能在未来的版本中发生变化。
Bulk()
操作在mongosh
和驱动器中的类似方法没有组中操作数量的限制。要查看批量操作执行时操作的分组情况,请在执行后调用Bulk.getOperations()
。
在一个分片集合上执行一个有序
操作列表通常会比执行一个无序
操作列表慢,因为在有序列表中,每个操作都必须等待前一个操作完成。
无序操作
使用无序操作列表,MongoDB 可以并行执行列表中的写操作,并且顺序不可预测。如果在处理列表中的某个写操作时发生错误,MongoDB 将继续处理列表中剩余的写操作。
使用 db.collection.initializeUnorderedBulkOp()
创建一个无序列表写命令的构建器。
当执行无序操作列表时,MongoDB 会将操作分组。在无序批量操作中,列表中的操作可能会重新排序以提高性能。因此,在执行 unordered
批量操作时,应用程序不应依赖于顺序。
Bulk()
操作在mongosh
和驱动器中的类似方法没有组中操作数量的限制。要查看批量操作执行时操作的分组情况,请在执行后调用Bulk.getOperations()
。
事务
对于 Bulk.insert()
操作,集合必须已经存在。
对于 Bulk.find.upsert()
,如果操作导致 upsert,集合必须已经存在。
如果在一个事务中运行,不要显式设置操作的写关注。要使用带有事务的写关注,请参阅 事务和写关注。
重要
在大多数情况下,分布式事务相比单个文档写入会带来更高的性能成本,分布式事务的可用性不应替代有效的架构设计。对于许多场景,去规范化数据模型(嵌入文档和数组)将继续是您数据和用例的最佳选择。也就是说,对于许多场景,适当地建模数据将最小化分布式事务的需求。
关于额外的事务使用考虑(例如运行时限制和oplog大小限制),请参阅生产注意事项。
方法
Bulk()
构建器有以下方法
名称 | 描述 |
---|---|
向操作列表中添加插入操作。 | |
指定更新或删除操作的条件查询。 | |
向操作列表中添加多个文档删除操作。 | |
向操作列表中添加单个文档删除操作。 | |
Bulk.find.delete() 的别名。 | |
Bulk.find.deleteOne() 的别名。 | |
向操作列表中添加单个文档替换操作。 | |
向操作列表中添加单个文档更新操作。 | |
向操作列表中添加 multi 更新操作。 | |
为更新操作指定 upsert: true 。 | |
批量执行一系列操作。 | |
返回在 Bulk() 操作对象中执行的写入操作数组。 | |
返回一个包含 Bulk() 操作对象中操作数和批次的 JSON 文档。 | |
将 Bulk.toJSON() 结果作为字符串返回。 |