在mongo DB中,update和updateMany方法有什么区别?

39

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


6
我猜想其中一个是另一个的包装。 - Sergio Tulentsev
4
根据更新日志(https://docs.mongodb.org/manual/release-notes/3.2/):它相当于使用<update>文档指定使用更新运算符进行修改且将multi选项设置为true的db.collection.update(<query>, <update>, { multi: true, ... })方法。 - Hiren S.
9
@SergioTulentsev所说的是最正确的陈述,主要涉及到.updateOne().updateMany()的区别,它们分别在"包装"的.update()内部"省略"或"显式包含""multi"选项。一些驱动程序文档将.update()标记为已弃用,但这并不完全正确,因为所有这些驱动程序实际上都在其.updateOne().updateMany()方法的实现中调用了.update()。这只是语义问题,它们实际上是相同的。 - Blakes Seven
6个回答

15

为了进一步解释Blakes Seven的回答,updateOne方法所做的就是将 multi 选项设置为 false,如此处(github)所示。

反之,updateMany 方法所做的就是将 multi 选项设置为 true,如此处(github)所示。

因此,并没有“更好”的方法可供调用,只需选择适合当前情况的方法即可。


updateOne 如果多个文档匹配查询,则更新第一个文档。 - Vivek Nuna

7

区别在于update()默认仅修改与指定筛选条件匹配的一个文档。但是,您可以通过添加修饰符{multi: true}来使其修改所有文档。另一方面, updateMany 修改所有与指定筛选条件匹配的文档。


6

“updateOne”和“updateMany”是较新的API,应该优先使用它们而非“update”。

在书籍《Mongo Definitive Guide》中(讨论“updateOne”时):

“更新文档必须包含更新操作符。之前的CRUD API版本无法捕获此类错误。在早期的更新方法中,这种情况将仅完成整个文档的替换。正是这种陷阱导致了新的CRUD API的创建。”

——《MongoDB: The Definitive Guide: Powerful and Scalable Data Storage》作者:Shannon Bradshaw, Eoin Brazil,等。


2

updateMany() and 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>, ... ]
}
      

1

之前的回答中缺少的一个区别是,update()不需要使用$set,如果没有使用$set,它实际上会删除文档中所有现有数据,并用提供的数据替换它。

updateMany()updateOne()实际上需要指定$set,如果没有使用$set,您将会得到一个错误,如:uncaught exception: Error: the update operation document must contain atomic operators

但这完全取决于您的用例。


-3

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

updateMany() --> 使用给定的筛选条件更新集合中的多个文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接