我正在尝试实现递增计数器。我将号码存储在'项目'收集并尝试在“问题”中插入新文档时检索并递增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});
});
});
答案 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);
}
});
});