3

クライアントから 1 つ以上のドキュメント (JSON 文字列) を 1 つの要求 (JSON 文字列化された JS オブジェクトの配列) で受け入れ、それらを mongodb に挿入/更新し、1 つの応答を送信する同期サーバー (SVN のようなもの) を開発しようとしています。 - これは、各ドキュメントの挿入/更新ステータス (および mongo の _id などのその他の情報) を含む JSON 文字列です。

それが 1 つのドキュメントである場合、1 つの挿入/更新を実行でき、そのコールバックで応答を送信できたはずです。

collection.insert(_data, function(error, result) {
    if(error) res.send('error');
    else res.send(JSON.stringify({result: result}));
});

しかし、複数のドキュメントがある場合にこれを行う方法。前のドキュメントのコールバックで 1 つのドキュメントを挿入/更新できます。しかし、それを行うと、恐ろしいコードのはしごになってしまうのではないかと心配しています(1つの関数でそれを実行して、はい、再帰できます)。

どんな助けでも大歓迎です。ところで、私はこのドライバーを使用しています: http://mongodb.github.io/node-mongodb-native/

注: 処理中の各ドキュメントには個別の処理が必要なため、バッチの挿入や更新については検討していません。挿入が必要なものもあれば、更新が必要なものもあり、バージョン番号と同期ステータスのチェックなどがあります。

4

1 に答える 1

5

これにはasyncモジュールを試してみてください。コレクション内の各アイテムを処理するための非常に便利なメソッドがいくつかあり、すべての処理が終了したときの機能を提供します。

特に、タスクをキューに追加し、すべてのアイテムが処理されたら、何かを実行できるキュー機能について言及します。

たとえば、次のようにします。

var q = async.queue(function(task, callback) {
  // task.doc would contain your individual doc to process

  // your insert / update logic goes here...

  // Callback signifies you're done with this task
  callback();

}, 2) // <--- this number specifies the number of tasks to run in parallel

q.drain = function() {
  // this is the queue's callback, called when the queue is empty,
  // i.e. when all your documents have been processed.

  res.send(statusCode, message);
} 

次に、 docsという名前の変数にドキュメントのリストがあると仮定すると、それらをすべて処理するために必要なことは、それらをキューにプッシュすることだけです。

for (var doc in docs) {
  q.push({ doc: docs[doc] }, function(err) {
    if (err) console.log(err);
  })
}

ヒント: ドキュメントを含むオブジェクトをキューにプッシュする必要があります。ラップされていないオブジェクトを渡そうとすると、奇妙なエラーが発生します。

Mongo で処理する各ドキュメントの特定のステータスが必要な場合は、このように完全に可能です。キューの外でデータ構造をインスタンス化する限り、各項目が処理されるたびに statusCodes (など) を追加し、キューのドレイン関数で構造をクライアントに送信できます。あまり面倒なことはいけません。

于 2013-09-30T11:39:28.017 に答える