2016-12-12 15 views
0

私はmongodbでNode.jsを使用しています。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

への変更を意味していますか? seqをインクリメントしようとしています。それは価値を増やしたようです。 – notionquest

+0

はい、以前は14歳でした。 updateコマンドだけで動作します。 –

答えて

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

ありがとう!これは私のdbのデータを更新していますが、objを 'Promise {pending}'として出力します。私はそれがなぜであるかわからない。 –

+0

プロミスはこの "console.log(obj);"のためです。 " – notionquest

+0

「obj.seq」を使用して「obj」オブジェクトを使用して「seq」の現在の値を取得することはできませんか? –

0

更新が同様に14である前に、あなたは "配列" の値を

var obj = sequence.findOneAndModify({ 
    _id: 1, 
    update: { $inc: {seq: 1}}, 
    upsert: true 
}); 
関連する問題