Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

bulkWrite vs initialize(Un)orderedBulkOp

what is the differences between those 2 methods, and which should I use?

  1. what is the diff between: initializeUnorderedBulkOp and bulkWrite with ordered: false
  2. what is the diff between: initializeOrderedBulkOp and default bulkWrite

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/

like image 421
arielorvits Avatar asked Feb 09 '20 11:02

arielorvits


People also ask

What is BulkWrite?

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.

What is the principle implications of using a bulk write operation in MongoDB?

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.


1 Answers

TL;DR

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.

Which one should you use?

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.

like image 63
Abhijit Avatar answered Oct 17 '22 10:10

Abhijit