2016-03-19 8 views
2

のNode.js:MongoDBの書き込み順序私がループしていた場合

for (var i = 0; i <= 100; i++) { 
    collection.updateOne(query, { 
    $set: { 
     number: i 
    } 
    }); 
} 

は私が送信された最後の更新はデータベースに保存されているものであろうことが保証されるだろうし、または可能性があることの一つ以上更新プログラムが順不同で到着する可能性がありますか?

更新プログラムが送信された順番どおりに届かない場合は、更新プログラムがデータベースからの応答を待つことなく、順番どおりに到着することを保証する方法があります同期ループ内で)。

答えて

2

は私が送信された最後の更新はデータベース

いいえ、ありませんあなたはこのコードを書かれている方法で保存されたものであろうことが保証されるだろう。

は、同期ループ内で動作する必要があるため、各ノード間でデータベースからの応答を待つことなく、更新が正常に到着することを保証する方法です。

再び、コールバックを使用せずに操作が完了するのを待ってから次の操作に移ります。

あなたの最善の選択肢は、非同期の反復を使用することですが、前の項目が完了するまで次の項目を反復することです。

serially iterating an array, asynchronouslyについてのブログ記事があります。その方法を説明します。

2

あなたが保証オーダーをしたい場合は、initializeorderedbulkop

例でBulk操作を使用します。

var bulk = db.collection.initializeOrderedBulkOp(); 

for(var i=0;i <= 100; i++){ 
    bulk.find({ ... }).updateOne(
     { 
      $set:{number:1} 
     } 
    ); 
} 

bulk.execute(); 
+0

ああ、素敵!それについては知らなかった。次回私はこれを必要とするでしょう。 :) –

+0

私の場合は、別々の操作でなければならないかもしれませんが、ある状況ではループのように速度で実行されます。しかし、これは知っておくと良いです。 – user2248702

+0

bulkはすべての種類の操作を受け入れ、一括して実行されます。ドキュメントを参照してください。 – Saleem

関連する問題