Bulk.execute()

在本页面

Tip

从 3.2 版开始,MongoDB 还提供了db.collection.bulkWrite()方法来执行批量写入操作。

Description

  • Bulk. execute ( )
    • 2.6 版的新功能。

执行由Bulk()操作构建器构建的操作列表。

Bulk.execute()接受以下参数:

ParameterTypeDescription
writeConcerndocument可选的。 Write concern用于整个批量操作的文档。忽略使用默认值。对于独立的mongod服务器,写关注默认为{ w: 1 }。使用副本集时,除非将其作为副本集配置的一部分进行修改,否则默认写关注点为{ w: 1 }


有关示例,请参见覆盖默认写问题

Returns:包含操作状态的BulkWriteResult对象。

执行后,如果不重新初始化就无法重新执行Bulk()对象。参见db.collection.initializeUnorderedBulkOp()db.collection.initializeOrderedBulkOp()

Behavior

Ordered Operations

在执行ordered操作列表时,MongoDB 按operation type和连续性对操作进行分组;即同一类型的连续操作被分组在一起。例如,如果一个有序列表具有两个插入操作,然后是一个更新操作,然后是另一个插入操作,则 MongoDB 会将操作分为三组:第一组包含两个插入操作,第二组包含更新操作,第三组包含最后的插入操作。此行为可能会在将来的版本中更改。

每组操作最多可以具有1000 operations。如果一个组超过此limit,则 MongoDB 将把该组分为 1000 个或更少的较小组。例如,如果批量操作列表包含 2000 个插入操作,则 MongoDB 将创建 2 个组,每个组包含 1000 个操作。

大小和分组机制是内部性能的详细信息,将来可能会更改。

要查看如何对批量操作执行的操作进行分组,请在执行之后*调用Bulk.getOperations()

在分片集合上执行ordered操作列表通常比执行unordered列表要慢,因为使用有序列表,每个操作必须 await 上一个操作完成。

Unordered Operations

在执行unordered操作列表时,MongoDB 将操作分组。对于无序的批量操作,可以对列表中的操作进行重新排序以提高性能。因此,执行unordered批量操作时,应用程序不应依赖于 Sequences。

每组操作最多可以具有1000 operations。如果一个组超过此limit,则 MongoDB 将把该组分为 1000 个或更少的较小组。例如,如果批量操作列表包含 2000 个插入操作,则 MongoDB 将创建 2 个组,每个组包含 1000 个操作。

大小和分组机制是内部性能的详细信息,将来可能会更改。

要查看如何对批量操作执行的操作进行分组,请在执行之后*调用Bulk.getOperations()

Examples

执行批量操作

以下代码在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({
   "writeErrors" : [ ],
   "writeConcernErrors" : [ ],
   "nInserted" : 2,
   "nUpserted" : 0,
   "nMatched" : 0,
   "nModified" : 0,
   "nRemoved" : 0,
   "upserted" : [ ]
})

有关返回对象的详细信息,请参见BulkWriteResult()。有关执行的批次的详细信息,请参见Bulk.getOperations()

覆盖默认写问题

对副本集的以下操作指定"w: majority"write concernwtimeout的 5000 毫秒,从而使该方法在写入传播到大多数有表决权的副本集成员之后返回,或者该方法在 5 秒钟后超时。

在版本 3.0 中进行了更改:在以前的版本中,majority引用了副本集的所有成员的大多数,而不是多数投票成员。

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: "majority", wtimeout: 5000 } );

该操作返回以下BulkWriteResult()对象:

BulkWriteResult({
   "writeErrors" : [ ],
   "writeConcernErrors" : [ ],
   "nInserted" : 2,
   "nUpserted" : 0,
   "nMatched" : 0,
   "nModified" : 0,
   "nRemoved" : 0,
   "upserted" : [ ]
})

See

Bulk()获取可用于批量操作的方法列表。