2017-06-26 18 views
0

現在、nodejsドライバを使用してmongodbにいくつかのエントリを実行しようとしている間、コールバック地獄に直面しています。すべてのレコード(配列内)が挿入されている場合にのみ実行する必要があるタスクがあります。 async.each method をチェックアウトしましたが、主な問題は、エラーが発生した場合にコールバックを呼び出すことです。したがって、コレクションの残りのアイテムは処理されません。mongodbに複数のレコードを挿入するmongodbドライバとasync.js

このような問題をasync.jsで処理する正しい方法は何ですか?

PS:私がasync.jsを使い始めたばかりであり、apiを使ってmongodbにバッチインサートするためにこれを使う例は非常に少ないので、非常に参考にしてください。

+0

非同期はひどい/時代遅れのアプローチです。代わりに約束を使うべきです。同じタイプの複数のレコードを挿入する最も良い方法は、単一の複数行の挿入を使用することです。 PostgreSQLの例は次のとおりです。https://stackoverflow.com/questions/37300997/multi-row-insert-with-pg-promiseあなたはmongodbのために同じものを見つける必要があります。 –

+0

@ vitaly-t私はそれは単なる意見だと思う。コールバック地獄のためのグーグルは非常に一般的な解決策asyncjsをもたらす。現在、私はasync.jsに行くことを好むでしょう – rahulserver

+2

@rahulserverので、10の挿入がある場合、繰り返し#6で何が起こるはずですか?前の要素(#1〜#5)を削除しますか?次の(#7〜#10)に進みますか?またはここで停止するだけで(#6〜#10は挿入されません)、最後の関数()でコードを実行しないでください。 –

答えて

2

問題を説明しましょう。

  1. あなたは、いくつかのライブラリ(例:AsyncJS)
  2. 非同期フローはあなたが確認したいいくつかの反復
  3. で中断することが可能と反復ベースのフローを持っているすべてのMongoDBでoperatiosnが正しく に保存されていますか、たぶん私はあなたが一括操作を使用することをお勧めすることができ、この場合には、その操作が起こるべきか、将来の意思決定、あるいは全く

を取る

// array of operations 
let batch = yourCollection.initializeUnorderedBulkOp(); 

async.each (yourArrayToIterate, function (item, next) { 
    // add some Operation that will be execute lated 
    batch.insert({firstName:"Daniele"}); 
    batch.find({firstName: "Daniele"}).updateOne({$set: {lastName:"Tassone"}}); 
    // other code to do...some Old Library 
     try { 
     someOldLibrary.doSomethingThatCanCreateAnExpection(); 
     } catch (e) { 
     //some error happen 
     } 
    // more modern approach with New Library 
     someNewLibrary 
     .then(function (result){ 
     }) 
     .catch(function (err) { 
      // some error happen 
     } 

}, function (err, result) { 

     // Flow is now completed, take a decision 
    if (err) { 
     // do nothing, maybe? 
    } else { 
     // execute all the Ordered Bulk 
     batch.execute().then(function(executionResult) { 
      // done, you can 
     }); 
    } 
}); 

注: 1)BulkOperationは、OrderedおよびUnOrderedにすることができます。 UnOrderedは何らかのエラーが発生してもパフォーマンスが向上し、作業を続ける 2)秩序が順番に実行され、何らかのエラーが発生した場合、MongoDはバルクの次の要素に進むことはありません。

ドキュメント: http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#initializeOrderedBulkOp

関連する問題