sql >> Database >  >> NoSQL >> MongoDB

Meerdere array-objecten bijwerken in mongodb

Hoewel ik niet denk dat het herhalen van een verwacht aantal de "beste" manier is om dit te doen, zijn hier in feite de correcties op wat je probeert te doen, met wat hulp van het knooppunt async bibliotheek voor stroomregeling:

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

Dus de belangrijkste dingen hier zijn dat uw .update() statement zou in plaats daarvan moeten zoeken naar de "events.handled.visibile": false overeenkomsten, en natuurlijk moet u ervoor zorgen dat de bewerkingen "in serie" worden uitgevoerd, anders is er geen echte garantie dat u het document in feite in een gewijzigde staat pakt ten opzichte van de vorige .update() .

De async.whilst behandelt de flow control zodat het wacht op de voltooiing van elke .update() tot het uitvoeren van de volgende. Wanneer de eerste logische verklaring true is ( teller uitgeput ) en alle .update() instructies worden uitgevoerd, dan wordt de lus vrijgegeven voor de laatste callback.

Waar mogelijk zou u echt "Bulk"-updatebewerkingen moeten gebruiken, zoals vermeld in het antwoord dat u volgt . Die verzendt alle updates en heeft slechts één reactie, dus de overhead van het wachten tot elke bewerking is voltooid, wordt geëlimineerd.




  1. CouchDB/Couchbase/MongoDB transactie-emulatie?

  2. Welke beveiligingsmechanismen heeft Meteor?

  3. MongoDB zoeken op DateTime-type werkt niet

  4. Azure Function met Cosmos MongoDB-integratie wordt niet opgeslagen