【问题标题】:Update multiple documents and return all updated documents更新多个文档并返回所有更新的文档
【发布时间】:2017-07-03 22:12:47
【问题描述】:

我正在寻找一种使用mongoose 一次更新多个文档并返回所有修改过的文档的方法。我尝试在update() 中设置multi:true。它正在更新所有匹配的文档,但不返回任何文档。然后我尝试了findOneAndUpdate()。即使有很多匹配的文档,它也只会更新并返回一个文档。是的,函数名本身就说明了,它只会更新一个,我还是试过了。我无法在findOneAndUpdate() 中设置像multi:true 这样的选项。如何做呢?提前致谢

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    首先更新,然后按照 Jyotmans 的答案获取。

    const update = await Model.updateMany({
        condition: "value"
    }, {
        "$set": {
            field: "value"
        }
    }, {
        "multi": true
    });
    // res.json(icMessages)
    
    const get = await Model.find({
        room: req.params.room
    }).exec()
    res.json(get)
    

    【讨论】:

    • 请注意,这不是原子的。除非您采取其他措施来防止它发生,例如使用(分布式)互斥锁无处不在您写入该集合,否则集合可能会在 updateMany 和 find 操作之间进行修改。
    【解决方案2】:

    目前我认为 MongoDB 不可能更新多个文档并在同一个查询中返回所有更新的文档。

    在 Mongoose 中,findOneAndUpdate() 基于 MongoDB 的原生 findAndModify() 方法。

    如果您查看findAndModify() 方法的官方documentation,它的状态是-

    findAndModify 命令修改并返回单个文档。

    虽然查询可能匹配多个文档,但 findAndModify 只会选择一个文档进行修改。

    因此,您不能使用findAndModify 更新多个文档。

    另一方面,update()updateMany() 方法使用multi 标志更新许多文档,但它只返回看起来像这样的WriteResult -

    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    

    【讨论】:

    • 感谢@Jyotman 的澄清。那么我将进行两个不同的查询。
    • 小心。您将失去原子性,并可能在此处丢失数据。如果在您find 之后但在您delete 之前添加了一个新文档怎么办?这份新文件将永远消失在虚空中……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多