Mongoose pre hook或方法不能与findOneAndUpdate方法一起使用

时间:2016-01-17 17:42:52

标签: mongoose

我正在尝试实现递增计数器。我将号码存储在'项目'收集并尝试在“问题”中插入新文档时检索并递增1。集合。

我尝试了几种不同的方式并且没有成功。我可以通过简单地获取数字并将其递增1并使用表单提交来轻松实现这一点,但之后我就不会学习了。从我看到的其他一些答案来看,中间件看来问题是不知道findOneAndUpdate查询操作的文档。

这是我尝试的第一个.pre操作没有成功。

.pre('save', function(next) {
 counter = Project.findOneAndUpdate({_id: this.project}, {$inc: { numberSeq: 1} });
 console.log(counter);
 this.number = counter.numberSeq;
 next();
});

接下来,我试了一下。除了文档更新外,一切似乎都在控制台输出中起作用。

.pre('save', function(next){
  console.log('attempting to get next num ');
  Project.findOneAndUpdate({_id: this.project}, {$inc: { numberSeq: 1} }, function(error, counter)   {
    console.log('project is ' + counter.project);
    console.log('number seq is ' + counter.numberSeq);
    this.number = counter.numberSeq;
    console.log('next num sequence is: ' + this.number);
      next();
  });

});

最后,这是我尝试使用的方法。

IssueSchema.methods.getNextNumber = function(project) {
    Project.findOneAndUpdate({_id: project}, {$inc: { numberSeq: 1} }, function(error, counter)   {
        if(error) {
            return error;
          }
          console.log(counter.numberSeq);
        return counter.numberSeq;
    });
};

并像这样使用。它几乎可以工作,但更新似乎在方法提供下一个数字之前完成,并且数字最终未定义。我尝试了几种方法使它同步,但无济于事

    var issue = new Issues({
      title: req.body.title,
      description: req.body.description,
      fields: req.body.fields,
      project: req.body.project,
      created_by: req.user || req.body.created_by,
      type: req.body.type,

    });

    issue.number = issue.getNextNumber();

    issue.save(function(err, result) {
      if (err) {
        return res.status(409).send({message: 'There was an error creating the issue: ' + err});
      }
      console.log(result);
      res.send({message: 'New issue created', result: result});
    });
  });

1 个答案:

答案 0 :(得分:0)

我一直在墙上扔飞镖,直到最后卡住了。事实证明这很简单,我只需要在回调中分配数字然后再抛出。

.pre('save', function(next) {
  Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) {
    if (err) {
      console.log(err);
    }
      this.number = doc.numberSeq;
      next();
    });
})
.post('save', function(doc) {
  Project.update({_id: doc.project}, {$inc:  {numberSeq: 1}}, function(err, result) {
    if (err) {
      console.log(err);
    }
  });
});