首页 文章

MongoDB中findAndModify和更新有什么区别?

提问于
浏览
154

我对MongoDB中的 findAndModify 方法感到有点困惑 . 它比 update 方法有什么优势?对我来说,它似乎只是首先返回项目,然后更新它 . 但为什么我需要先退回物品呢?我读了 MongoDB: the definitive guide ,它说操作队列和执行需要获取和设置样式原子性的其他操作很方便 . 但我不明白它是如何实现这一目标的 . 有人可以向我解释一下吗?

4 回答

  • 26

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

    “原子地”执行此操作意味着您可以保证您正在返回正在更新的完全相同的项目 - 即,之间不会发生其他操作 .

  • 8

    findAndModify 返回文档,更新没有 .

    如果我正确理解Dwight Merriman(mongoDB的原始作者之一),使用update来修改单个文档,即("multi":false}也是原子的 . 目前,它也应该比使用 findAndModify 进行等效更新更快 .

  • 49

    来自MongoDB docs(重点补充):

    默认情况下,两个操作都会修改单个文档 . 但是,带有multi选项的update()方法可以修改多个文档 . 如果多个文档与更新条件匹配,则对于findAndModify(),您可以指定排序以提供对要更新的文档的某种控制措施 . 使用update()方法的默认行为,您无法指定在多个文档匹配时要更新的单个文档 . 默认情况下,findAndModify()方法返回文档的预修改版本 . 要获取更新的文档,请使用新选项 . update()方法返回包含操作状态的WriteResult对象 . 要返回更新的文档,请使用find()方法 . 但是,其他更新可能已在您的更新和文档检索之间修改了文档 . 此外,如果更新仅修改了单个文档但匹配了多个文档,则需要使用其他逻辑来标识更新的文档 . 您不能指定findAndModify()的写入问题来覆盖默认的写入问题,而从MongoDB 2.6开始,您可以指定update()方法的写入问题 . 修改单个文档时,findAndModify()和update()方法都会自动更新文档 .

  • 138

    一类有用的用例是计数器和类似的情况 . 例如,看一下这段代码(MongoDB测试之一):find_and_modify4.js .

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

相关问题