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

Cách tiếp cận đúng để cập nhật nhiều bản ghi trong MongoDB bằng Mongoose là gì

Cách tiếp cận xây dựng một tiêu chí bao gồm tất cả các id tài liệu và sau đó thực hiện cập nhật có thể gây ra các vấn đề tiềm ẩn. Khi bạn lặp lại danh sách tài liệu gửi thao tác cập nhật với mỗi tài liệu, trong Mongoose, bạn có nguy cơ làm nổ máy chủ của mình, đặc biệt là khi xử lý tập dữ liệu lớn vì bạn không đợi lệnh gọi không đồng bộ hoàn tất trước khi chuyển sang phần tiếp theo sự lặp lại. Về cơ bản, bạn sẽ xây dựng một "chồng" các hoạt động chưa được giải quyết cho đến khi điều này gây ra sự cố - Stackoverflow.

Ví dụ:giả sử bạn có một mảng id tài liệu mà bạn muốn cập nhật tài liệu phù hợp trên trường trạng thái:

const processedIds = [
  "57a0a96bd1c6ef24376477cd",
  "57a052242acf5a06d4996537",
  "57a052242acf5a06d4996538"
];

nơi bạn có thể sử dụng updateMany () phương pháp

Model.updateMany(
  { _id: { $in: processedIds } }, 
  { $set: { status: "processed" } }, 
  callback
);

hoặc cách khác đối với các tập dữ liệu thực sự nhỏ, bạn có thể sử dụng forEach () trên mảng để lặp lại nó và cập nhật bộ sưu tập của bạn:

processedIds.forEach(function(id)){
  Model.update({ _id: id}, { $set: { status: "processed" } }, callback);
});

Ở trên là ổn đối với các tập dữ liệu nhỏ. Tuy nhiên, điều này trở thành một vấn đề khi bạn phải đối mặt với hàng nghìn hoặc hàng triệu tài liệu cần cập nhật vì bạn sẽ thực hiện lặp đi lặp lại các cuộc gọi máy chủ mã không đồng bộ trong vòng lặp.

Để khắc phục điều này, hãy sử dụng một cái gì đó như eachLimit và lặp qua mảng thực hiện thao tác cập nhật MongoDB cho từng mục trong khi không bao giờ thực hiện nhiều hơn x cập nhật song song cùng một lúc.

Cách tiếp cận tốt nhất là sử dụng API hàng loạt vì điều này cực kỳ hiệu quả trong việc xử lý các bản cập nhật hàng loạt. Sự khác biệt về hiệu suất so với việc gọi thao tác cập nhật trên mỗi và mọi tài liệu là thay vì gửi yêu cầu cập nhật đến máy chủ với mỗi lần lặp lại, API hàng loạt sẽ gửi yêu cầu một lần trong mỗi 1000 yêu cầu (theo đợt).

Đối với phiên bản Mongoose > =4.3.0 hỗ trợ Máy chủ MongoDB 3.2.x , bạn có thể sử dụng BulkWrite () để cập nhật. Ví dụ sau đây cho thấy cách bạn có thể thực hiện điều này:

const bulkUpdateCallback = function(err, r){
  console.log(r.matchedCount);
  console.log(r.modifiedCount);
}

// Initialize the bulk operations array
const bulkUpdateOps = [], counter = 0;

processedIds.forEach(function (id) {
  bulkUpdateOps.push({
    updateOne: {
      filter: { _id: id },
      update: { $set: { status: "processed" } }
    }
  });
  counter++;

  if (counter % 500 == 0) {
    // Get the underlying collection via the Node.js driver collection object
    Model.collection.bulkWrite(bulkUpdateOps, { ordered: true, w: 1 }, bulkUpdateCallback);
    bulkUpdateOps = []; // re-initialize
  }
})

// Flush any remaining bulk ops
if (counter % 500 != 0) {
  Model.collection.bulkWrite(bulkOps, { ordered: true, w: 1 }, bulkUpdateCallback);
}

Đối với phiên bản Mongoose ~ 3.8.8 , ~ 3.8.22 , 4.x hỗ trợ Máy chủ MongoDB > =2.6.x , bạn có thể sử dụng Bulk API như sau

var bulk = Model.collection.initializeOrderedBulkOp(),
    counter = 0;

processedIds.forEach(function(id) {
    bulk.find({ "_id": id }).updateOne({ 
        "$set": { "status": "processed" }
    });

    counter++;
    if (counter % 500 == 0) {
        bulk.execute(function(err, r) {
           // do something with the result
           bulk = Model.collection.initializeOrderedBulkOp();
           counter = 0;
        });
    }
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
    bulk.execute(function(err,result) {
       // do something with the result here
    });
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để lấy độ dài của con trỏ từ mongodb bằng python?

  2. Trình điều khiển MongoDB và Java:bỏ qua chữ hoa và chữ thường trong truy vấn

  3. Thư viện JasperReports và MongoDB

  4. Chèn mongodb hàng loạt trong Meteor hoặc Node

  5. Hướng dẫn PyMongo:Kiểm tra chuyển đổi dự phòng MongoDB trong ứng dụng Python của bạn