无法使用findAndModify更新数据库

时间:2016-12-12 08:47:20

标签: node.js mongodb

我使用Node.js和mongodb。

    var mongo = require("mongodb").MongoClient;
    var url = process.env.MLAB_URI;

    mongo.connect(url, function (err, db) {
      if (err) {
      console.log('Unable to connect to the mongoDB server. Error:', err);
      } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established');
    var sequence = db.collection('sequence')

    //Find and modify the sequence counter.
    var obj = sequence.findAndModify({
      query: {_id: 1},
      update: { $inc: {seq: 1}},
      new: true
    });

    console.log(obj);

    sequence.find({_id:1}).toArray(function(err,res){
      if(err)
        console.log(err);
      else
        console.log(res)
    });

     db.close();
  }
});

但是上面的代码没有更新数据库,返回的obj输出是Promise { <pending> }。 完整的输出是

Connection established
Promise { <pending> }
[ { _id: 1, seq: 0 } ]

我需要更新值并检索对象。有没有办法做到这一点? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

请按照以下说明更改findAndModify

var obj = sequence.findAndModify(
  {_id: 1},
  {},
  {  $inc: {"seq": 1}},      
  {new:true, upsert:true}
);

避免承诺的第二个选项: -

  

评论console.log(obj);

var obj = sequence.findAndModify(
  {_id: "1"},
  {},
  {  $inc: {"seq": 1}},      
  {new:true, upsert:true}, function (err, doc) {
    if(err)
    console.log(err);
  else
    console.log(doc);
  }
);

您正在引用Mongo shell版本并尝试使用NodeJS版本实现相同的版本。 NodeJS findAndModify版本略有不同。

为了获得seq的旧值,您可以将new标志设置为false,doc.value.seq为您提供旧值(即更新前的值)。

sequence.findAndModify(
  {_id: "1"},
  {},
  {  $inc: {"seq": 1}},      
  {new:false, upsert:true}, function (err, doc) {
    if(err)
    console.log(err);
  else {

    console.log(doc);
    console.log(doc.value.seq);
  }
  });

答案 1 :(得分:0)

更改为

var obj = sequence.findOneAndModify({
  _id: 1,
  update: { $inc: {seq: 1}},
  upsert: true
});