mongodb 从mongoose post findOneAndUpdate hook更新

c86crjj0  于 2023-04-20  发布在  Go
关注(0)|答案(4)|浏览(196)

我试图更新所有findOneAndUpdate调用的文档。所以我使用Mongoose中间件编写了一个post钩子。我使用Mongoose 4.6

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

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

i7uaboj4

i7uaboj41#

Mongoose中间件文档指出:
查询中间件与文档中间件有一个微妙但重要的区别:在文档中间件中,这指的是正在更新的文档。在查询中间件中,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!');
       }
    });
});
vawmfj5a

vawmfj5a2#

mongoose 5.xNode.js >= 7.6.0:

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

gupuwyp23#

使用PRE Hook代替POST Hook。
POST Hook:在收集保存的POST Hook后将执行。PRE Hook:在保存集合之前,将执行Pre Hook。

jv4diomz

jv4diomz4#

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

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

相关问题