On this page
Bulk.execute()
在本页面
Tip
从 3.2 版开始,MongoDB 还提供了db.collection.bulkWrite()方法来执行批量写入操作。
Description
Bulk.
execute
( )- 2.6 版的新功能。
执行由Bulk()操作构建器构建的操作列表。
Bulk.execute()接受以下参数:
Parameter | Type | Description |
---|---|---|
writeConcern |
document | 可选的。 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 concern和wtimeout
的 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()获取可用于批量操作的方法列表。