【问题标题】:What is the difference between update and updateMany method in mongo DB?mongoDB中的update和updateOne方法有什么区别?
【发布时间】:2016-08-11 16:29:56
【问题描述】:

我正在尝试更新 mongo db 上的多个文档。使用 multi = true 或 updateMany 方法哪个更好?它们之间有什么区别?

【问题讨论】:

  • 我怀疑一个是另一个的包装器。
  • 根据更改日志 (docs.mongodb.org/manual/release-notes/3.2) :它等效于带有 使用更新运算符指定修改并将多选项设置为 true 的文档。
  • @SergioTulentsev 所说的是最真实的说法。这主要是关于.updateOne().updateMany() 的区别,它们分别在“包装”.update() 中“省略”"multi" 选项或明确“包含”它。一些驱动程序文档将.update() 标记为已弃用,但这并不完全正确,因为所有这些驱动程序实际上在其.updateOne().updateMany() 方法的实现中调用了.update()。真的只是语义而已,两者实际上是一样的。

标签: node.js mongodb


【解决方案1】:

updateMany()updateOne()

updateMany(query, update, options) => Modifies ALL the doc's which matches the query.
updateOne(query, update, options)  => Modifies a SINGLE first doc which matches the query.

updateMany() 和 updateOne() 选项:

{
    upsert: <boolean>,
    writeConcern: <document>,
    collation: <document>,
    arrayFilters: [ <filterdocument1>, ... ]
}

更新():

update(query, update, options)    => Modifies a SINGLE first doc which matches the query. 
              (DEFAULT behaviour. But you could used as a "updateMany()" or "updateOne()" 
               by changing the "multi: <boolean>" inside options)

update() 选项:

{
    multi: <boolean>,   // multi: true  => became => updateMany() 
                        // multi: false => became => updateOne()

    upsert: <boolean>,
    writeConcern: <document>,
    collation: <document>,
    arrayFilters: [ <filterdocument1>, ... ]
}
      

【讨论】:

    【解决方案2】:

    要扩展Blakes Seven 的答案,所有updateOne 方法所做的只是将multi 选项设置为false,如here (github) 所示。

    反过来,所有updateMany 方法所做的就是将multi 选项设置为true,如here (github) 所示。

    所以没有“更好”的方法可以调用,只要选择你认为适合情况的方法即可。

    【讨论】:

    • updateOne 如果多个文档与查询匹配,则更新第一个文档
    【解决方案3】:

    我发现在以前的答案中缺少的一个区别是 update() 不需要使用 $set 并且没有 $set 它实际上会删除文档中的所有现有数据并将其替换为您提供的数据。

    虽然 updateMany()updateOne() 实际上需要指定 $set 而不指定 $set,但您将收到类似 uncaught exception: Error: the update operation document must contain atomic operators 的错误

    不过,这完全取决于您的用例。

    【讨论】:

      【解决方案4】:

      “updateOne”和“updateMany”是较新的 API,应尽可能使用,而不是“update”。

      在《Mongo Definitive Guide》一书中(同时谈到“updateOne”):

      “更新文档必须包含更新操作符。以前版本的 CRUD API 没有捕捉到这种类型的错误。在这种情况下,较早的更新方法将简单地完成整个文档的替换。正是这种陷阱导致了新的 CRUD API 的创建。”

      — MongoDB:权威指南:强大且可扩展的数据存储作者 Shannon Bradshaw、Eoin Brazil 等人。

      【讨论】:

        【解决方案5】:

        不同的是update()默认只修改一个匹配指定过滤器的文档。但是,您可以通过添加modifier {multi: true} 使其修改所有文档。另一方面,updateMany 修改所有匹配指定过滤器的文档。

        【讨论】:

          【解决方案6】:

          updateOne() --> 只更新集合中的一个文档。

          updateMany() --> 使用给定过滤器更新集合中的许多文档。

          【讨论】:

            猜你喜欢
            • 2016-06-21
            • 2022-12-09
            • 2012-06-02
            • 1970-01-01
            • 2023-03-09
            • 2022-11-05
            • 1970-01-01
            • 2019-02-07
            • 1970-01-01
            相关资源
            最近更新 更多