Bulk.execute()
提示
MongoDB还提供了用于执行批量写入操作的 db.collection.bulkWrite()
。
说明
Bulk.execute()
执行由
Bulk()
操作构建器构建的操作列表。Bulk.execute()
接受以下参数:Parameter类型说明writeConcern
文档返回: 包含操作状态的 BulkWriteResult()
对象。执行后,如果不重新初始化,就无法重新执行
Bulk()
对象。请参阅db.collection.initializeUnorderedBulkOp()
和db.collection.initializeOrderedBulkOp()
。
行为
有序操作
执行 ordered
操作列表时,MongoDB 会根据 operation type
和连续性对操作进行分组;也就是说,相同类型的连续 操作会被分在一组。例如,如果有序列表有两个插入操作,后跟一个更新操作,然后是另一个插入操作,则 MongoDB 将这些操作分为三个单独的组:第一组包含两个插入操作,第二组包含更新操作,第三组包含最后一次插入操作。这种行为在未来版本中可能会有所更改。
mongosh
中的 Bulk()
操作以及驱动程序中的类似方法对群组中的操作数量不设限制。要了解如何对这些操作进行分组以执行批量操作,请在执行后调用 Bulk.getOperations()
。
在分片集合上执行操作的 ordered
列表通常比执行 unordered
列表慢,因为对于有序列表,每个操作都必须等待前一个操作完成。
无序操作
执行 unordered
操作列表时,MongoDB 会对操作进行分组。对于无序批量操作,可以对列表中的操作进行重新排序以提高性能。因此,在执行 unordered
批量操作时,应用程序不应依赖排序。
mongosh
中的 Bulk()
操作以及驱动程序中的类似方法对群组中的操作数量不设限制。要了解如何对这些操作进行分组以执行批量操作,请在执行后调用 Bulk.getOperations()
。
事务
对于 Bulk.insert()
操作,必须存在集合。
对于 Bulk.find.upsert()
,如果操作导致 upsert,则必须存在集合。
如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
示例
执行批量操作
以下示例在 items
集合上初始化 Bulk()
操作构建器,添加一系列插入操作并执行操作:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "abc123", status: "A", defaultQty: 500, points: 5 } ); bulk.insert( { item: "ijk123", status: "A", defaultQty: 100, points: 10 } ); bulk.execute( );
操作会返回以下 BulkWriteResult()
对象:
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })
有关返回对象的详细信息,请参见 BulkWriteResult()
。有关执行批次的详细信息,请参见 Bulk.getOperations()
。
覆盖默认写关注
以下对副本集的操作指定了"w: 1"
的写关注,其中 wtimeout
为 5000 毫秒,以便该方法在写操作传播到大多数投票副本集节点后返回,或者该方法在 5 秒后超时。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "efg123", status: "A", defaultQty: 100, points: 0 } ); bulk.insert( { item: "xyz123", status: "A", defaultQty: 100, points: 0 } ); bulk.execute( { w: 1, wtimeout: 5000 } );
操作会返回以下 BulkWriteResult()
对象:
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })