Để cải thiện hiệu suất, hãy tận dụng lợi thế của việc sử dụng Bulk()
API để cập nhật hàng loạt bộ sưu tập một cách hiệu quả vì bạn sẽ gửi các hoạt động đến máy chủ theo lô (ví dụ:kích thước lô là 500). Điều này mang lại cho bạn hiệu suất tốt hơn nhiều vì bạn sẽ không gửi mọi yêu cầu đến máy chủ mà chỉ gửi một lần trong mỗi 500 yêu cầu, do đó làm cho các bản cập nhật của bạn hiệu quả hơn và nhanh hơn.
Phần sau minh họa cách tiếp cận này, ví dụ đầu tiên sử dụng Bulk()
API có sẵn trong các phiên bản MongoDB> =2.6 và <3.2. Nó cập nhật tất cả các tài liệu phù hợp trong bộ sưu tập từ một mảng nhất định bằng cách tăng 1 cho trường được hiển thị. Nó giả định rằng mảng hình ảnh có cấu trúc
var images = [
{ "_id": 1, "name": "img_1.png" },
{ "_id": 2, "name": "img_2.png" }
{ "_id": 3, "name": "img_3.png" },
...
{ "_id": n, "name": "img_n.png" }
]
Phiên bản MongoDB> =2.6 và <3.2 :
var bulk = db.images.initializeUnorderedBulkOp(),
counter = 0;
images.forEach(function (doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$inc": { "shown": 1 }
});
counter++;
if (counter % 500 === 0) {
// Execute per 500 operations
bulk.execute();
// re-initialize every 500 update statements
bulk = db.images.initializeUnorderedBulkOp();
}
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }
Ví dụ tiếp theo áp dụng cho phiên bản MongoDB 3.2 mới mà từ đó không dùng nữa Bulk()
API và cung cấp một bộ apis mới hơn bằng cách sử dụng bulkWrite()
.
MongoDB phiên bản 3.2 trở lên :
var ops = [];
images.forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$inc": { "shown": 1 }
}
}
});
if (ops.length === 500 ) {
db.images.bulkWrite(ops);
ops = [];
}
})
if (ops.length > 0)
db.images.bulkWrite(ops);