MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách cập nhật nhiều đối tượng mảng trong mongodb

Mặc dù tôi không nghĩ rằng việc lặp lại số lượng dự kiến ​​là cách "tốt nhất" để thực hiện điều này, nhưng về cơ bản đây là các chỉnh sửa đối với những gì bạn đang cố gắng thực hiện, với sự trợ giúp của nút async thư viện để kiểm soát luồng:

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

Vì vậy, những điều chính ở đây là .update() của bạn thay vào đó, câu lệnh phải tìm kiếm "events.handled.visibile": false khớp và tất nhiên bạn cần đảm bảo các thao tác thực thi "theo chuỗi", nếu không, không có gì đảm bảo thực sự rằng bạn đang lấy tài liệu ở trạng thái đã thay đổi từ .update() trước đó .

async.whilst xử lý điều khiển luồng để nó đợi hoàn thành mỗi .update() cho đến khi thực hiện tiếp theo. Khi câu lệnh logic đầu tiên là true (bộ đếm đã cạn kiệt) và tất cả .update() các câu lệnh được chạy thì vòng lặp sẽ giải phóng cho lệnh gọi lại cuối cùng.

Nếu có thể, bạn thực sự nên sử dụng các thao tác cập nhật "Hàng loạt" như được tham chiếu trong câu trả lời mà bạn đang theo dõi . Điều đó sẽ gửi tất cả các bản cập nhật và một lần và chỉ có một phản hồi, do đó, việc chờ đợi mỗi thao tác hoàn tất sẽ được loại bỏ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:ngoại lệ trong initAndListen:20 Đã cố tạo tệp khóa trên thư mục chỉ đọc:/ data / db, chấm dứt

  2. Truy vấn các tài liệu có trường con nội bộ của một giá trị nhất định

  3. Đặt mật khẩu cho cơ sở dữ liệu mongo của sao băng

  4. Tìm xem ai đó có sinh nhật trong 30 ngày tới với mongo hay không

  5. Dân số + Tổng hợp trong Mongoose