bulkWrite 与 initialize(Un)orderedBulkOp

bulkWrite vs initialize(Un)orderedBulkOp

这两种方法有什么区别,我应该使用哪种?

  1. initializeUnorderedBulkOp 和 bulkWrite 与 ordered: false 之间的区别是什么
  2. initializeOrderedBulkOp 和 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/

TL;DR

区别主要在于用法。 bulkWrite 接收一组操作并 立即执行它.

initializeOrderedBulkOp and initializeUnorderedBulkOp return 可用于逐步构建查询并最终使用 execute 函数执行的实例。


派对迟到了,但我也有类似的困惑,所以做了一些挖掘。

区别在于API实现和使用。

  • bulkWrite

    根据 API 参考,

    Perform a bulkWrite operation without a fluent API

    在此方法中,您直接传入一个“写入操作”数组作为第一个参数。有关示例,请参见 here。我认为 流畅 API,他们的意思是你不完全将你的 update 操作与你的 [=19] 分开 =] 操作或 delete 操作。每个操作都在一个数组中。

    一个关键点是这些操作是立即执行的

    如问题中所述,默认情况下执行是有序的,但可以通过在第二个参数(一组选项)中设置 { ordered: false } 来更改为无序。

    函数的 return 值为 BulkWriteResult,其中包含有关已执行的批量操作的信息。

  • initializeOrderedBulkOp and initializeUnorderedBulkOp

    再次参考API参考,

    Initiate an In order bulk write operation

    正如这里所说,这些方法 initialize/return 一个为构建块操作提供 API 的实例 。这些实例分别属于 class OrderedBulkOperation and UnorderedBulkOperation

    const bulk = db.items.initializeUnorderedBulkOp();
    // `bulk` is of the type UnorderedBulkOperation
    

    这个 bulk 变量提供了一个“流畅的 API”,它允许您 构建 您在整个应用程序中的查询:

    bulk.find( { /** foo **/ } ).update( { $set: { /** bar **/ } } );
    

    请记住,这些查询 不会在上面的代码中执行 。您可以继续构建整个操作,当所有写操作都被“调用”时,我们终于可以执行查询了:

    bulk.execute();
    

    这个 execute 函数 return 是一个 BulkWriteResult 实例,基本上就是 bulkWrite return 的实例。我们的数据库终于改好了。

你应该使用哪一个?

这取决于您的要求。

如果您想使用现有数组中的单独查询和值更新大量文档,bulkWrite 似乎很合适。如果您想通过相当复杂的业务逻辑构建您的批量操作,其他选项是有意义的。请注意,您可以通过逐渐构建全局数组并将其最后传递给 bulkWrite.

来实现相同的目的