批量写入与 initialize(Un)orderedBulkOp

ari*_*its 8 bulk mongodb node.js

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

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

Abh*_*jit 2

长话短说

区别主要在于用法。bulkWrite接受一系列操作并立即执行它

initializeOrderedBulkOpinitializeUnorderedBulkOp返回一个实例,该实例可用于逐渐构建查询并最终使用该execute函数执行它。


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

区别在于API的实现和使用。

  • bulkWrite

    根据 API 参考,

    无需流畅的 API 即可执行批量写入操作

    在此方法中,您直接传入“写操作”数组作为第一个参数。请参阅此处的示例。我认为流畅的 API意味着您没有将您的操作与您的操作或操作完全分开。每个操作都在一个数组中。updateinsertdelete

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

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

    该函数的返回值BulkWriteResult包含有关执行的批量操作的信息。

  • initializeOrderedBulkOpinitializeUnorderedBulkOp

    再次参考API参考,

    启动按顺序批量写入操作

    正如这里所说,这些方法初始化/返回一个实例,该实例提供用于构建块操作的 API。这些实例分别属于类OrderedBulkOperationUnorderedBulkOperation

    const bulk = db.items.initializeUnorderedBulkOp();
    // `bulk` is of the type UnorderedBulkOperation
    
    Run Code Online (Sandbox Code Playgroud)

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

    bulk.find( { /** foo **/ } ).update( { $set: { /** bar **/ } } );
    
    Run Code Online (Sandbox Code Playgroud)

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

    bulk.execute();
    
    Run Code Online (Sandbox Code Playgroud)

    execute函数返回一个BulkWriteResult实例,这基本上就是bulkWrite返回的内容。我们的数据库终于改变了。

您应该使用哪一个?

这取决于您的要求。

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