我正在尝试为所有FindOneAndupdate调用更新文档。因此,我使用Mongoose中间件写了一个帖子挂钩。我正在使用Mongoose 4.6
mySchema.post('findOneAndUpdate', function(result) {
result.currentEvent = result.Events.slice(-1);
this.model.update({}, { currentEvent: result.currentEvent }).exec();
});
,但这只会更新返回的对象,而不是我集合中的文档。有办法做到吗?
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!');
}
});
});
来自mongoose 5.x
和Node.js >= 7.6.0:
mySchema.post('findOneAndUpdate', async (result) => {
result.currentEvent = result.Events.slice(-1);
await result.save();
});
而不是使用后钩使用pre hook。
帖子挂钩:将执行保存后的挂钩后。前钩:保存收集之前将执行挂钩。
您可以使用findoneandupdate挂钩,之后可以使用方法result.save()
mySchema.post('findOneAndUpdate', function(result) {
result.currentEvent = result.Events.slice(-1);
result.save(function(err) {
if(!err) {
console.log("Document Updated");
}
});
});