MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So aktualisieren Sie mehrere Array-Objekte in Mongodb

Obwohl ich nicht denke, dass das Iterieren über eine erwartete Anzahl der "beste" Weg ist, dies zu tun, sind hier im Grunde die Korrekturen an dem, was Sie zu tun versuchen, mit etwas Hilfe durch den Knoten async Bibliothek zur Flusskontrolle:

  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
    }
  );

Die wichtigsten Dinge hier sind also, dass Ihr .update() -Anweisung sollte stattdessen nach "events.handled.visibile": false suchen übereinstimmen, und natürlich müssen Sie sicherstellen, dass die Operationen "in Reihe" ausgeführt werden, da es sonst keine wirkliche Garantie dafür gibt, dass Sie das Dokument tatsächlich in einem geänderten Zustand aus dem vorherigen .update() abrufen .

Der async.whilst handhabt die Flusskontrolle so, dass sie auf den Abschluss jedes .update() wartet bis zur Ausführung des nächsten. Wenn die erste logische Anweisung true ist ( Zähler erschöpft ) und alle .update() Anweisungen ausgeführt werden, wird die Schleife zum letzten Callback freigegeben.

Wenn möglich, sollten Sie wirklich "Bulk"-Aktualisierungsvorgänge verwenden, wie in der Antwort, der Sie folgen . Das sendet alle Updates und hat nur eine einzige Antwort, sodass der Overhead des Wartens auf den Abschluss jeder Operation eliminiert wird.