【问题标题】:Update from mongoose post findOneAndUpdate hook从 mongoose post findOneAndUpdate 钩子更新
【发布时间】:2017-05-06 05:37:32
【问题描述】:

我正在尝试更新所有 findOneAndUpdate 调用的文档。所以我用 Mongoose 中间件写了一个 post hook。我正在使用 Mongoose 4.6

mySchema.post('findOneAndUpdate', function(result) {
    result.currentEvent = result.Events.slice(-1);
    this.model.update({}, { currentEvent: result.currentEvent }).exec();
});

但这只会更新返回的对象,而不是我集合中的文档。有没有办法做到这一点?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    Mongoose 中间件documentation 声明:

    查询中间件与文档中间件略有不同,但 重要方式:在文档中间件中,this指的是文档 正在更新。在查询中间件中,猫鼬不一定有 对正在更新的文档的引用,所以这指的是查询 对象而不是正在更新的文档。

    尝试用以下代码替换您的代码:

    mySchema.post('findOneAndUpdate', function(result) {
        result.currentEvent = result.Events.slice(-1);
        this.save(function(err) {
           if(!err) {
             console.log("Document Updated");
            }
         });
    });
    

    希望它应该可以工作。

    您也可以使用以下代码找到文档,然后保存修改后的文档:

    mySchema.find({*condition*}, function(err, result) {
    result.currentEvent = result.Events.slice(-1);
    result.save(function (err) {
            if(err) {
            console.error('ERROR!');
           }
        });
    });
    

    【讨论】:

    • this.save 不是函数?
    【解决方案2】:

    来自mongoose 5.xNode.js >= 7.6.0:

    编辑纠正错字:

    mySchema.post('findOneAndUpdate', async (result) => {
      result.currentEvent = result.Events.slice(-1);
      await result.save();
    });
    

    【讨论】:

      【解决方案3】:

      不要使用 POST Hook,而是使用 PRE Hook。

      POST Hook:集合保存后会执行 Post Hook。 PRE Hook:在保存集合之前会执行 Pre Hook。

      【讨论】:

        【解决方案4】:

        你可以使用 findOneAndUpdate 钩子,之后你可以使用方法 result.save()

        mySchema.post('findOneAndUpdate', function(result) {
            result.currentEvent = result.Events.slice(-1);
            result.save(function(err) {
               if(!err) {
                 console.log("Document Updated");
                }
             });
        });
        

        【讨论】:

        • 多个重复的答案。也许您可以编辑您的答案以说明为什么它比其他答案更好。
        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2019-12-26
        • 2015-10-27
        • 2016-12-15
        • 2017-08-13
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        相关资源
        最近更新 更多