我正在尝试更新mongoose集合名称counter
但它没有得到更新。
专柜收藏
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var counterSchema = new Schema({
_id: {type: String, required: true},
sequence_value: {type: Number, default: 1}
});
var Counter = module.exports = mongoose.model('Counter', counterSchema);
API
router.post('/increment',function(req, res, next){
console.log('Sequence Counter::' + getNextSequenceValue("productId"));
)};
getNextSequenceValue方法
function getNextSequenceValue(sequenceName){
var sequenceDocument = Counters.findOneAndUpdate({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true,
upsert: true
});
console.log('Counter value::' + sequenceDocument.sequence_value);
return sequenceDocument.sequence_value;
}
但每次点击/increment
API时,console.log都会打印undefined
。
答案 0 :(得分:1)
您将始终获得undefined
,因为sequenceDocument
是Promise
,如果更新操作成功,稍后将使用更新的文档解析,如果不是,则将拒绝并返回错误。在您的情况下,console.log
语句将在数据库操作完成之前运行。这是因为findOneAndUpdate
是一个返回Promise
对象的异步操作。
更新可能会失败,因为您以不正确的方式将参数传递给findOneAndUpdate
。该函数接受查询作为第一个参数,更新操作作为第二个参数,查询选项作为第三个参数。
您可以通过以下方式重写getNextSequenceValue
:
function getNextSequenceValue(sequenceName) {
return Counters.findOneAndUpdate(
{ // query
_id: sequenceName
},
{ $inc: { sequence_value: 1 } }, // update operation
{ // update operation options
new: true,
upsert: true
}
).then(sequenceDocument => sequenceDocument.sequence_value)
}
它现在将返回Promise
,它将使用序列值解析。您可以在控制器中使用它,如下所示:
router.post('/increment', function(req, res, next) {
getNextSequenceValue('productId')
.then(sequenceValue => {
console.log(sequenceValue)
})
.catch(error => {
// handle possible MongoDB errors here
console.log(error)
})
})