Sử dụng BulkWrite
API để thực hiện các bản cập nhật xử lý điều này tốt hơn
mongodb.connect(mongo_url, function(err, db) {
if(err) console.log(err)
else {
var mongo_products_collection = db.collection("products")
mongoUpsert(mongo_products_collection, data_products, function() {
db.close()
})
}
})
function mongoUpsert(collection, data_array, cb) {
var bulkUpdateOps = data_array.map(function(data) {
return {
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
};
});
collection.bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
});
return cb(false);
}
Nếu bạn đang xử lý các mảng lớn hơn, tức là> 1000 thì hãy cân nhắc gửi các lần ghi tới máy chủ theo lô 500, điều này mang lại cho bạn hiệu suất tốt hơn vì bạn không gửi mọi yêu cầu đến máy chủ, chỉ một lần trong mỗi 500 yêu cầu.
Đối với các hoạt động hàng loạt, MongoDB áp đặt giới hạn nội bộ mặc định 1000 hoạt động trên mỗi lô và do đó, lựa chọn 500 tài liệu là tốt theo nghĩa là bạn có một số quyền kiểm soát kích thước lô hơn là để MongoDB áp đặt mặc định, tức là cho các hoạt động lớn hơn với quy mô> 1000 tài liệu. Vì vậy, đối với trường hợp trên, trong cách tiếp cận đầu tiên, người ta có thể viết tất cả các mảng cùng một lúc vì mảng này nhỏ nhưng lựa chọn 500 dành cho các mảng lớn hơn.
var ops = [],
counter = 0;
data_array.forEach(function(data) {
ops.push({
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
});
counter++;
if (counter % 500 == 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
});
ops = [];
}
})
if (counter % 500 != 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
}
}