Giả sử bạn có một loạt các đối tượng mà bạn muốn cập nhật trong bộ sưu tập của mình trên các id phù hợp như
var soldItems = [
{
"_id": 1,
"value": 4
},
{
"_id": 2,
"value": 27
}
];
thì 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:
soldItems.forEach(function(item)){
Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
});
hoặc sử dụng lời hứa như
var updates = [];
soldItems.forEach(function(item)){
var updatePromise = Model.update({"_id": item._id}, {"$set": {"value": item.value }});
updates.push(updatePromise);
});
Promise.all(updates).then(function(results){
console.log(results);
});
hoặc sử dụng map()
var updates = soldItems.map(function(item)){
return Model.update({"_id": item._id}, {"$set": {"value": item.value }});
});
Promise.all(updates).then(function(results){
console.log(results);
});
Đối với các mảng lớn hơn, bạn có thể tận dụng lợi thế của việc sử dụng API ghi hàng loạt để có hiệu suất tốt hơn. Đối với phiên bản Mongoose >=4.3.0
hỗ trợ MongoDB Server 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:
var bulkUpdateCallback = function(err, r){
console.log(r.matchedCount);
console.log(r.modifiedCount);
}
// Initialise the bulk operations array
var bulkOps = soldItems.map(function (item) {
return {
"updateOne": {
"filter": { "_id": item._id } ,
"update": { "$set": { "value": item.value } }
}
}
});
// Get the underlying collection via the native node.js driver collection object
Model.collection.bulkWrite(bulkOps, { "ordered": true, w: 1 }, bulkUpdateCallback);
Đối với các 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;
soldItems.forEach(function(item) {
bulk.find({ "_id": item._id }).updateOne({
"$set": { "value": item.value }
});
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
});
}