0

この問題に遭遇したのはこれが 2 回目なので、何か間違っているのは私に違いありません。コレクションのすべてのドキュメントをプロジェクションで含むカーソルを作成し、コレクションを更新できるようにこのカーソルを反復処理したいと考えています。

たとえば、データを別の方法で表示できるようにカーソルを並べ替え、その並べ替え方法に基づいて、ドキュメントを更新する方法や削除する方法について十分な情報に基づいた決定を下すことができますが、うまくいかないようです。

cursor.each(function(err, doc) {
     if(err) throw err;

    if(doc==null)
    {
        return db.close();
    }

    //Remove 
    doc.scores.splice(3, 1);

    query2 = {"_id":doc._id};

    db.collection('highscores').update(query2, doc, function(err, updated) {
                if(err) throw err;

                console.dir("Updated Doc" + doc._id);


             });

    console.dir(doc);

これを行うためのより効率的な方法はありますか、それとも何か不足していますか?

4

1 に答える 1

4

NodeJS モジュール、特に NodeJS 用の MongoDB ドライバーでよくあることですが、ほとんどのコマンドとアクションは非同期です。

したがって、db.closeカーソルが使い果たされたときにコードが使用されていました。ループ内の一部の更新は完了できた可能性がありますが、実際に更新する前にデータベース接続が閉じられた可能性があります。

each提供する例で使用して、関数ブロックを終了する必要がありreturnます。

cursor.each(function(err, doc) {
    if(err) throw err;

    if(doc === null) {
        return;
    }

    //Remove 
    doc.scores.splice(3, 1);

    var query2 = {"_id": doc._id};

    db.collection('highscores').update(query2, doc, function(err, updated) {
       if(err) throw err;
       console.dir("Updated Doc" + doc._id);
    });

    console.dir(doc);
});

また、実行している更新操作を潜在的に最適化するupdateoperatorを確認$setすることもできます (参照)。コレクション内のドキュメント全体を更新するのではなく、ドキュメントに指定した値のみを「設定」します。

配列演算子も見てみましょう。これらは、作業している特定のケースで役立つ場合があります。

于 2013-11-10T20:46:28.883 に答える