Nó bị nổ tung bởi vì bạn không đợi một cuộc gọi không đồng bộ hoàn tất trước khi chuyển sang lần lặp tiếp theo. Điều này có nghĩa là bạn đang 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ố. Tên của trang web này một lần nữa là gì? Lấy hình ảnh?
Vì vậy, đây không phải là cách tốt nhất để tiếp tục với "Bulk"
phụ trang. May mắn thay, trình điều khiển MongoDB cơ bản đã nghĩ về điều này, ngoài vấn đề gọi lại được đề cập trước đó. Trên thực tế, có một "API hàng loạt"
có sẵn để làm cho điều này tốt hơn rất nhiều. Và giả sử bạn đã lấy trình điều khiển gốc làm db
sự vật. Nhưng tôi chỉ thích sử dụng .collection
trình truy cập từ mô hình và "async"
mô-đun để làm cho mọi thứ rõ ràng:
var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;
async.whilst(
// Iterator condition
function() { return count < 1000000 },
// Do this in the iterator
function(callback) {
counter++;
var model = buildModel(counter);
bulk.insert(model);
if ( counter % 1000 == 0 ) {
bulk.execute(function(err,result) {
bulk = Model.collection.initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}
},
// When all is done
function(err) {
if ( counter % 1000 != 0 )
bulk.execute(function(err,result) {
console.log( "inserted some more" );
});
console.log( "I'm finished now" ;
}
);
Sự khác biệt ở đó là sử dụng cả hai phương thức gọi lại "không đồng bộ" khi hoàn thành thay vì chỉ tạo một ngăn xếp, nhưng cũng sử dụng "API hoạt động hàng loạt" để giảm thiểu các lệnh gọi ghi không đồng bộ bằng cách gửi mọi thứ trong câu lệnh cập nhật hàng loạt gồm 1000 mục nhập.
Điều này không chỉ không chỉ "xây dựng một chồng" thực thi chức năng như mã ví dụ của riêng bạn, mà còn thực hiện các giao dịch "dây" hiệu quả bằng cách không gửi tất cả mọi thứ trong các báo cáo riêng lẻ, mà chia thành các "lô" có thể quản lý cho cam kết của máy chủ .