sql >> Databáze >  >> NoSQL >> MongoDB

Jak aktualizovat více objektů Array v mongodb

I když si nemyslím, že iterace přes očekávaný počet je „nejlepší“ způsob, jak toho dosáhnout, zde jsou v podstatě opravy toho, co se snažíte udělat, s určitou pomocí uzlu async knihovna pro řízení toku:

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

Takže hlavní věcí je, že váš .update() příkaz by měl místo toho hledat "events.handled.visibile": false shoduje se a samozřejmě se musíte ujistit, že se operace provádějí "v sérii", jinak neexistuje skutečná záruka, že ve skutečnosti berete dokument ve změněném stavu z předchozího .update() .

async.whilst zpracovává řízení toku tak, že čeká na dokončení každého .update() až do provedení dalšího. Když je jeho první logický příkaz true ( počítadlo vyčerpáno ) a všechny .update() jsou spuštěny příkazy, pak se smyčka uvolní ke konečnému zpětnému volání.

Kde je to možné, měli byste skutečně používat operace „hromadné“ aktualizace, jak je uvedeno v odpovědi, kterou sledujete . To odešle všechny aktualizace a má pouze jednu odpověď, takže odpadá režie čekání na dokončení každé operace.




  1. Jak používat Elasticsearch s MongoDB?

  2. Jak implementovat Redis Multi-Exec pomocí Spring-data-Redis

  3. Jak potlačit sloupec v mongodb pomocí ovladačů Java?

  4. pymongo update_one(), upsert=Pravda bez použití operátorů $