2016-01-17 60 views
0

我正在尝试实现递增计数器。我将这个数字存储在'projects'集合中,并尝试在'issues'集合中插入新文档时检索并加1。Mongoose预钩或方法不能与findOneAndUpdate方法一起使用

我已经尝试了这种方法,并没有取得成功。我可以简单地通过获取数字并将其递增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}); 
    }); 
    }); 

回答

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); 
    } 
    }); 
}); 
相关问题