从mongoose post findOneAndUpdate hook更新

时间:2016-12-20 21:56:20

标签: javascript node.js mongodb mongoose

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

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

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

3 个答案:

答案 0 :(得分:0)

Mongoose中间件documentation声明:

  

查询中间件与文档中间件的区别在于微妙但是   重要的方法:在文档中间件中,这是指文档   正在更新。在查询中间件中,mongoose不一定有   对正在更新的文档的引用,因此这是指查询   对象而不是正在更新的文档。

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

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!');
       }
    });
});

答案 1 :(得分:0)

代替使用POST挂钩,请使用PRE挂钩。

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

答案 2 :(得分:0)

mongoose 5.xNode.js >= 7.6.0:

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