MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara Memperbarui Beberapa objek Array di mongodb

Meskipun saya tidak berpikir bahwa mengulangi jumlah yang diharapkan adalah cara "terbaik" untuk melakukan ini, pada dasarnya ini adalah koreksi untuk apa yang Anda coba lakukan, dengan bantuan dari node async perpustakaan untuk kontrol aliran:

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

Jadi hal utama di sini adalah bahwa .update() . Anda pernyataan seharusnya mencari "events.handled.visibile": false cocok, dan tentu saja Anda perlu memastikan operasi dijalankan "dalam rangkaian", jika tidak, tidak ada jaminan nyata bahwa Anda sebenarnya mengambil dokumen dalam keadaan yang diubah dari .update() sebelumnya .

async.whilst menangani kontrol aliran sehingga menunggu penyelesaian setiap .update() sampai eksekusi berikutnya. Ketika pernyataan logis pertama adalah true ( penghitung habis ) dan semua .update() pernyataan dijalankan maka loop akan dirilis ke panggilan balik terakhir.

Jika memungkinkan, Anda harus benar-benar menggunakan operasi pembaruan "Massal" seperti yang dirujuk dalam jawaban yang Anda ikuti . Itu mengirim semua pembaruan dan sekali dan hanya memiliki satu respons, sehingga overhead menunggu setiap operasi selesai dihilangkan.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Buka:Buat antarmuka io.Writer untuk masuk ke database mongodb

  2. Metode kursor agregasi apa yang didukung oleh driver Nodejs?

  3. Konfigurasikan Mongo menggunakan mongodb+srv

  4. Cara memperbarui objek dalam array di Mongo

  5. Bagaimana Cara Mencocokkan Koleksi yang Digabung Menggunakan Laravel dan MongoDB?