sql >> データベース >  >> NoSQL >> MongoDB

mongodbで複数の配列オブジェクトを更新する方法

    予想されるカウントを繰り返すことがこれを行うための「最良の」方法だとは思いませんが、ノード async フロー制御用のライブラリ:

      async.waterfall(
        [
          function(callback) {
            collection.aggregate(
              [
                { "$match": { "_id": ObjectId("4d2d8deff4e6c1d71fc29a07") } },
                { "$unwind": "$events" },
                { "$match": { "events.handled.visibile": false } },
                { "$group": {
                  "_id": "$_id",
                  "count": { "$sum": 1 }
                }}
              ],
              callback
            );
          },
    
          function(results,callback) {
            console.log(results);
            var result = results[0];
    
            async.whilst(
              function() { return result.count-- },
              function(callback) {
                collection.update(
                  { "_id": result._id, "events.handled.visibile": false },
                  { "$set": { "events.$.handled.visibile": true } },
                  callback
                )
              },
              callback
            );
          }
        ],
        function(err) {
          if (err) throw err;
          // finished now
        }
      );
    

    したがって、ここでの主なことは、.update() ステートメントは、代わりに"events.handled.visibile": falseを検索する必要があります 一致します。もちろん、操作が「連続して」実行されることを確認する必要があります。そうしないと、以前の.update()から変更された状態でドキュメントを実際に取得しているという実際の保証はありません。 。

    async.whilst .update()の完了を待機するようにフロー制御を処理します 次を実行するまで。最初の論理ステートメントがtrueの場合 (カウンターが枯渇しました)およびすべての.update() ステートメントが実行されると、ループは最後のコールバックに解放されます。

    可能な場合は、フォローしている回答 。これにより、すべての更新が1回だけ送信され、応答が1つだけになるため、各操作が完了するのを待つオーバーヘッドがなくなります。




    1. MongoDBデータベース内のすべてを削除します

    2. ネストされたデータによるドキュメントの並べ替えMongoDB

    3. マングースからすべてのコレクションを見つける方法

    4. Node.JSでファイルを保存するMongoDBGridFSの問題