我正在尝试使用Mongoose的findOneAndUpdate
挂钩(详细讨论here),尽管我在尝试设置更新后的值时遇到了一些问题。
例如:
MySchema.findOneAndUpdate({_id: fj394hri3hfj}, {$push: {comments: myNewComment}})
将触发以下钩子:
MySchema.post('findOneAndUpdate', function(result) {
this.update({}, { totalNumberOfComments: result.comments.length });
});
虽然钩子会再次$push
到comments
myNewComment
,因此会重复输入。
我在钩子中使用this.update({}, {....})
而不是this.findOneAndUpdate({}, {....})
,因此post
挂钩不会被无限调用。
totalNumberOfComments
完全设置为comments.length
的长度。
好像this.update({}, {....})
似乎只是将更多更新字段推送到this
上现有的更新字段。
如何在我的钩子中设置totalNumberOfComments
而不是再次推送到评论?
答案 0 :(得分:4)
问题似乎出现在您在帖子findOneAndUpdate
挂钩中写的更新查询中。尝试用,替换它,
MySchema.post('findOneAndUpdate', function(result) {
this.totalNumberOfComments = this.result.comments.length;
this.save(function(err) {
if(!err) {
console.log("Document Updated");
}
});
});
希望它能够奏效。
我还建议,使用find
和save
更新文档而不是findOneAndUpdate
及其帖子。
修改:
如果您需要使用find
和save
,则可以将以上代码替换为:
MySchema.findById(fj394hri3hfj, function(err, doc){
doc.comments.push(myNewComment);
doc.totalNumberOfComments += 1;
doc.save(function(err){
console.log("Document Updated");
});
});
它应该有用。