On this page本页内容
Starting in version 3.2, MongoDB also provides the 从3.2版开始,MongoDB还提供了db.collection.bulkWrite()
method for performing bulk write operations.db.collection.bulkWrite()
方法来执行批量写入操作。
Bulk.execute()
Executes the list of operations built by the 执行Bulk()
operations builder.Bulk()
操作生成器生成的操作列表。
Bulk.execute()
accepts the following parameter:接受以下参数:
writeConcern | document |
|
BulkWriteResult() object that contains the status of the operation.BulkWriteResult() 对象。 |
After execution, you cannot re-execute the 执行后,如果不重新初始化,则无法重新执行Bulk()
object without reinitializing. Bulk()
对象。See 请参见db.collection.initializeUnorderedBulkOp()
and db.collection.initializeOrderedBulkOp()
.db.collection.initializeUnorderedBulkOp()
和db.collection.initializeOrderedBulkOp()
。
When executing an 当执行有序的操作列表时,MongoDB根据操作类型和连续性对操作进行分组;即,将相同类型的连续操作分组在一起。ordered
list of operations, MongoDB groups the operations by the operation type
and contiguity; i.e. contiguous operations of the same type are grouped together. For example, if an ordered list has two insert operations followed by an update operation followed by another insert operation, MongoDB groups the operations into three separate groups: first group contains the two insert operations, second group contains the update operation, and the third group contains the last insert operation. 例如,如果一个有序列表有两个插入操作,随后是一个更新操作,然后是另一个插入操作。MongoDB将这些操作分为三个单独的组:第一组包含两个插入作业,第二组包含更新作业,第三组包含最后一个插入作业。This behavior is subject to change in future versions.此行为可能会在将来的版本中更改。
Bulk()
operations in mongosh
and comparable methods in the drivers do not have a limit for the number of operations in a group. mongosh
中的Bulk()
操作和驱动程序中的类似方法对组中的操作数量没有限制。To see how the operations are grouped for bulk operation execution, call 要查看操作如何分组以执行批量操作,请在执行后调用Bulk.getOperations()
after the execution.Bulk.getOperations()
。
Executing an 在分片集合上执行有序操作列表通常会比执行无序列表慢,因为对于有序列表,每个操作都必须等待前一个操作完成。ordered
list of operations on a sharded collection will generally be slower than executing an unordered
list since with an ordered list, each operation must wait for the previous operation to finish.
When executing an 当执行无序操作列表时,MongoDB会对操作进行分组。unordered
list of operations, MongoDB groups the operations. With an unordered bulk operation, the operations in the list may be reordered to increase performance. 对于无序批量操作,可以对列表中的操作重新排序以提高性能。As such, applications should not depend on the ordering when performing 因此,应用程序在执行无序批量操作时不应依赖于顺序。unordered
bulk operations.
Bulk()
operations in mongosh
and comparable methods in the drivers do not have a limit for the number of operations in a group. mongosh
中的Bulk()
操作和驱动程序中的类似方法对组中的操作数量没有限制。To see how the operations are grouped for bulk operation execution, call 要查看如何为批量操作执行对操作进行分组,请在执行后调用Bulk.getOperations()
after the execution.Bulk.getOperations()
。
Bulk()
can be used inside multi-document transactions.Bulk()
可以在多文档事务中使用。
For 对于Bulk.insert()
operations, the collection must already exist.Bulk.insert()
操作,集合必须已经存在。
For 对于Bulk.find.upsert()
, if the operation results in an upsert, the collection must already exist.Bulk.find.upsert()
,如果操作导致upsert,则集合必须已经存在。
Do not explicitly set the write concern for the operation if run in a transaction. 如果在事务中运行,请不要显式设置操作的写入关注点。To use write concern with transactions, see Transactions and Write Concern.要在事务中使用写关注点,请参阅事务和写关注点。
In most cases, multi-document transaction incurs a greater performance cost over single document writes, and the availability of multi-document transactions should not be a replacement for effective schema design. 在大多数情况下,与单文档写入相比,多文档事务会带来更高的性能成本,并且多文档事务的可用性不应取代有效的模式设计。For many scenarios, the denormalized data model (embedded documents and arrays) will continue to be optimal for your data and use cases. 对于许多场景,非规范化的数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。That is, for many scenarios, modeling your data appropriately will minimize the need for multi-document transactions.也就是说,对于许多场景,适当地建模数据将最大限度地减少对多文档事务的需要。
For additional transactions usage considerations (such as runtime limit and oplog size limit), see also Production Considerations.有关其他事务使用注意事项(如运行时限制和oplog大小限制),请参阅生产注意事项。
The following initializes a 下面将初始化Bulk()
operations builder on the items
collection, adds a series of insert operations, and executes the operations: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( );
The operation returns the following 该操作返回以下BulkWriteResult()
object:BulkWriteResult()
对象:
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })
For details on the return object, see 有关返回对象的详细信息,请参阅BulkWriteResult()
. BulkWriteResult()
。For details on the batches executed, see 有关执行的批的详细信息,请参阅Bulk.getOperations()
.Bulk.getOperations()
。
The following operation to a replica set specifies a write concern of 以下对副本集的操作指定了写关注点"w: 1"
with a wtimeout
of 5000 milliseconds such that the method returns after the writes propagate to a majority of the voting replica set members or the method times out after 5 seconds."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 } );
The operation returns the following 该操作返回以下BulkWriteResult()
object:BulkWriteResult()
对象:
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })
Bulk()
for a listing of methods available for bulk operations.获取可用于批量操作的方法列表。