我正在尝试更新MongoDB上的多个文档。使用 multi=true 的更新方法和 updateMany 方法哪个更好?它们之间有什么区别?
为了进一步解释Blakes Seven的回答,updateOne
方法所做的就是将 multi
选项设置为 false
,如此处(github)所示。
反之,updateMany
方法所做的就是将 multi
选项设置为 true
,如此处(github)所示。
因此,并没有“更好”的方法可供调用,只需选择适合当前情况的方法即可。
updateOne
如果多个文档匹配查询,则更新第一个文档。 - Vivek Nuna区别在于update()
默认仅修改与指定筛选条件匹配的一个文档。但是,您可以通过添加修饰符{multi: true}
来使其修改所有文档。另一方面, updateMany
修改所有与指定筛选条件匹配的文档。
“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,等。
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>, ... ]
}
之前的回答中缺少的一个区别是,update()
不需要使用$set
,如果没有使用$set
,它实际上会删除文档中所有现有数据,并用提供的数据替换它。
而updateMany()
和updateOne()
实际上需要指定$set
,如果没有使用$set
,您将会得到一个错误,如:uncaught exception: Error: the update operation document must contain atomic operators
但这完全取决于您的用例。
updateOne() --> 更新集合中的一个文档。
updateMany() --> 使用给定的筛选条件更新集合中的多个文档。
.updateOne()
和.updateMany()
的区别,它们分别在"包装"的.update()
内部"省略"或"显式包含""multi"
选项。一些驱动程序文档将.update()
标记为已弃用,但这并不完全正确,因为所有这些驱动程序实际上都在其.updateOne()
和.updateMany()
方法的实现中调用了.update()
。这只是语义问题,它们实际上是相同的。 - Blakes Seven