2016-12-12 89 views
0

我在使用Node.js和mongodb。无法使用findAndModify更新数据库

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 } ] 

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

+0

你的意思是 “序列” 前值更新为14呢?你正在尝试增加seq。它似乎增加了价值。 – notionquest

+0

是的,甚至在14之前。它只适用于更新命令。 –

回答

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); 
    } 
); 

你是指在蒙戈外壳版本,并尝试实现使用相同版本的NodeJS。 NodeJS findAndModify版本有点不同。

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

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); 
    } 
    }); 
+0

谢谢!这是更新我的数据库中的数据,但它仍然打印obj作为'Promise {pending}'。我不确定这是为什么。 –

+0

承诺是因为这个“console.log(obj);”。 – notionquest

+0

我可以不使用“obj”对象通过使用'obj.seq'来检索'seq'的当前值吗? –

0

变化

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