使用`findOneAndUpdate` Mongoose hook设置更新后的值

时间:2016-06-09 22:45:09

标签: mongodb mongoose

我正在尝试使用Mongoose的findOneAndUpdate挂钩(详细讨论here),尽管我在尝试设置更新后的值时遇到了一些问题。

例如:

MySchema.findOneAndUpdate({_id: fj394hri3hfj}, {$push: {comments: myNewComment}})

将触发以下钩子:

MySchema.post('findOneAndUpdate', function(result) {
    this.update({}, { totalNumberOfComments: result.comments.length });
});

虽然钩子会再次$pushcomments myNewComment,因此会重复输入。

我在钩子中使用this.update({}, {....})而不是this.findOneAndUpdate({}, {....}),因此post挂钩不会被无限调用。

totalNumberOfComments完全设置为comments.length的长度。

好像this.update({}, {....})似乎只是将更多更新字段推送到this上现有的更新字段。

如何在我的钩子中设置totalNumberOfComments而不是再次推送到评论?

1 个答案:

答案 0 :(得分:4)

问题似乎出现在您在帖子findOneAndUpdate挂钩中写的更新查询中。尝试用,替换它,

MySchema.post('findOneAndUpdate', function(result) {
    this.totalNumberOfComments = this.result.comments.length;
    this.save(function(err) {
       if(!err) {
          console.log("Document Updated");
       }
    });
});

希望它能够奏效。

我还建议,使用findsave更新文档而不是findOneAndUpdate及其帖子。

修改:

如果您需要使用findsave,则可以将以上代码替换为:

MySchema.findById(fj394hri3hfj, function(err, doc){

    doc.comments.push(myNewComment);
    doc.totalNumberOfComments += 1;
    doc.save(function(err){

       console.log("Document Updated");       
    }); 
});

它应该有用。