我对findAndModify
MongoDB中的方法有些困惑。它比update
方法有什么优势?对我来说,它似乎只是先返回该项目,然后再对其进行更新。但是为什么我需要先退货?我读了《MongoDB:权威指南》,它说它对于处理队列和执行其他需要获取和设置样式原子性的操作非常方便。但是我不明白它是如何实现的。有人可以向我解释吗?
我对findAndModify
MongoDB中的方法有些困惑。它比update
方法有什么优势?对我来说,它似乎只是先返回该项目,然后再对其进行更新。但是为什么我需要先退货?我读了《MongoDB:权威指南》,它说它对于处理队列和执行其他需要获取和设置样式原子性的操作非常方便。但是我不明白它是如何实现的。有人可以向我解释吗?
Answers:
如果您获取一个项目然后进行更新,则这两个步骤之间可能会有另一个线程进行更新。如果先更新一个项目然后取回它,则它们之间可能还会有另一个更新,并且您将获得与已更新项目不同的其他项目。
“以原子方式”进行操作意味着您可以确保完全取回要更新的项目-即在此之间不会发生其他操作。
从MongoDB文档中(添加了重点):
默认情况下,这两个操作都将修改单个文档。但是,带有multi选项的update()方法可以修改多个文档。
如果多个文档符合更新条件,则可以为findAndModify()指定一种排序方式,以提供对要更新哪个文档的控制措施。使用update()方法的默认行为,当多个文档匹配时,您无法指定要更新哪个文档。
默认情况下,findAndModify()方法返回文档的预修改版本。要获取更新的文档,请使用新选项。update()方法返回一个WriteResult对象,其中包含操作的状态。要返回更新的文档,请使用find()方法。但是,其他更新可能已在您的更新和文档检索之间修改了文档。同样,如果更新仅修改了一个文档,但匹配了多个文档,则您将需要使用其他逻辑来标识更新的文档。
在MongoDB 3.2之前,您不能为findAndModify()指定写关注以覆盖默认写关注,而自MongoDB 2.6起,您可以为update()方法指定写关注。
修改单个文档时,findAndModify()和update()方法都会自动更新文档。
findAndModify()
默认情况下仅修改一个文档并update()
可以更新一个或多个文档,但是当我使用时arrayFilters
,会findAndModify()
更新所有匹配项。也许是一个错误?
一类有用的用例是计数器和类似用例。例如,看下面的代码(MongoDB测试之一): find_and_modify4.js。
因此,随着findAndModify
您增加计数器并一步获得其增加的值。比较:如果您(A)分两个步骤执行此操作,而其他人(B)在您的步骤之间执行相同的操作,则A和B可能会获得相同的最后一个计数器值,而不是两个不同的值(只是一个可能出现问题的示例)。
findAndModify
保证没有其他更新操作干扰它?