what is the differences between those 2 methods, and which should I use?
https://docs.mongodb.com/manual/reference/method/db.collection.initializeUnorderedBulkOp/
https://docs.mongodb.com/manual/reference/method/db.collection.initializeOrderedBulkOp/
https://docs.mongodb.com/manual/core/bulk-write-operations/
Ordered BulkWrite:If the value of the ordered parameter is set to true, then starting from insertOne, all the operations are executed one by one. That is BulkWrite will start executing from insertOne, updateOne, updateMany, replaceOne, deleteOne and finally deleteMany.
MongoDB provides clients the ability to perform write operations in bulk. Bulk write operations affect a single collection. MongoDB allows applications to determine the acceptable level of acknowledgement required for bulk write operations.
The difference is mainly in the usage. bulkWrite
takes in an array of operations and executes it immediately.
initializeOrderedBulkOp
and initializeUnorderedBulkOp
return an instance which can be used to build queries gradually and execute it at last using the execute
function.
Late to the party but I had a similar confusion so did some digging up.
The difference lies in the API implementation and usage.
bulkWrite
According to the API reference,
Perform a bulkWrite operation without a fluent API
In this method, you directly pass in an array of "write operations" as the first argument. See here for examples. I think by fluent API, they mean you don't exactly separate your update
operations from your insert
operations or delete
operations. Every operation is in one array.
One crucial point is These operations are executed immediately.
As noted in the question, the execution is ordered by default but can be changed to unordered by setting { ordered: false }
in the second argument which is a set of options.
The return value of the function is BulkWriteResult
which contains information about the executed bulk operation.
initializeOrderedBulkOp
and initializeUnorderedBulkOp
Referring to the API reference again,
Initiate an In order bulk write operation
As it says here, these methods initialize/return an instance which provides an API for building block operations. Those instances are of the class OrderedBulkOperation
and UnorderedBulkOperation
respectively.
const bulk = db.items.initializeUnorderedBulkOp();
// `bulk` is of the type UnorderedBulkOperation
This bulk
variable provides a "fluent API" which allows you to build your queries across the application:
bulk.find( { /** foo **/ } ).update( { $set: { /** bar **/ } } );
Bear in mind, these queries are not executed in the above code. You can keep on building the whole operation and when all the write operations are "called", we can finally execute the query:
bulk.execute();
This execute
function returns a BulkWriteResult
instance which is basically what bulkWrite
returns. Our database is finally changed.
It depends on your requirements.
If you want to update a lot of documents with separate queries and values from an existing array, bulkWrite
seems a good fit. If you want to build your bulk operation through a fairly complex business logic, the other options make sense. Note that you can achieve the same by constructing a global array gradually and passing it in the end to bulkWrite
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With