Search code examples
node.jsmongodbbulk

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/


Solution

  • 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.