Mongoose集合没有得到更新

时间:2018-01-13 14:00:33

标签: node.js mongodb mongoose

我正在尝试更新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

1 个答案:

答案 0 :(得分:1)

您将始终获得undefined,因为sequenceDocumentPromise,如果更新操作成功,稍后将使用更新的文档解析,如果不是,则将拒绝并返回错误。在您的情况下,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)
    })
})