在MongoDB中findAndModify和update有什么区别?

MongoDB中的findAndModify方法让我有点困惑。 它比update方法有什么优势? 对我来说,它似乎只是返回项目,然后更新它。 但为什么我需要先把物品退回? 我读了MongoDB:权威性的指南 ,它说这对处理队列和执行其他需要获取和设置样式primefaces性的操作来说非常方便。 但我不明白它是如何实现这一点。 有人可以向我解释这个吗?

如果您获取某个项目然后进行更新,则这两个步骤之间可能会有另一个线程进行更新。 如果您先更新一个项目然后获取它,那么可能会有另一个更新,您将获得与更新项目不同的项目。

这样做“自动”意味着你可以保证,你正在取回你正在更新的完全相同的项目 – 即没有其他操作之间可以发生。

findAndModify返回文档,更新不。

如果我正确地理解了Dwight Merriman(mongoDB的原作者之一),那么使用update来修改单个文档(即“multi”:false)也是primefaces性的,目前它也应该快于使用findAndModify进行等效更新。

从MongoDB文档 (重点添加):

  • 默认情况下,这两个操作都会修改单个文档。 但是,具有多选项的update()方法可以修改多个文档

  • 如果多个文档符合更新条件,那么对于findAndModify(),您可以指定一个sorting来提供某种控制措施来更新要更新的文档。 使用update()方法的默认行为,当多个文档匹配时,不能指定要更新哪个文档。

  • 默认情况下,findAndModify()方法返回 文档 预修改版本。 要获取更新的文档,请使用新选项。 update()方法返回一个包含操作状态的WriteResult对象。 要返回更新的文档,请使用find()方法。 但是,其他更新可能会更新您的更新和文档检索之间的文档。 另外,如果更新只修改了单个文档但多个文档匹配,则需要使用其他逻辑来识别更新的文档。

  • 你不能指定一个写关注findAndModify()来覆盖默认的写关注,而从MongoDB 2.6开始,你可以指定一个关于update()方法的写关注

修改单个文档时,findAndModify()和update()方法会自动更新文档。

一类有用的用例是计数器和类似的情况。 例如,看看这个代码(其中一个MongoDBtesting): find_and_modify4.js 。

因此,使用findAndModify可以递增计数器并一步获得递增的值。 比较:如果您(A)分两步执行此操作,而其他人(B)在您的步骤之间执行相同的操作,则A和B可能会得到相同的最后一个计数器值,而不是两个不同的(只是一个可能的问题的示例)。