Bạn có thể làm điều đó nhưng bạn cần thay đổi quy ước gọi của mình để thực hiện việc này vì chỉ biểu mẫu "gọi lại" mới thực sự trả về đối tượng bộ sưu tập mà từ đó .initializeUnorderedBulkOp ()
phương thức có thể được gọi. Cũng có một số khác biệt về cách sử dụng so với cách bạn nghĩ rằng điều này hoạt động:
var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
var bulk = collection.initializeUnorderedBulkOp();
count = 0;
for (var i = 0; i < 200000; i++) {
bulk.insert({number: i});
count++;
if ( count % 1000 == 0 )
bulk.execute(function(err,result) {
// maybe do something with results
bulk = collection.initializeUnorderedBulkOp(); // reset after execute
});
});
// If your loop was not a round divisor of 1000
if ( count % 1000 != 0 )
bulk.execute(function(err,result) {
// maybe do something here
});
});
Vì vậy, bản thân các phương thức "Bulk" thực tế không yêu cầu gọi lại và hoạt động chính xác như được hiển thị trong tài liệu. Ngoại lệ là .execute ()
thực sự gửi các câu lệnh tới máy chủ.
Mặc dù trình điều khiển sẽ giải quyết vấn đề này cho bạn phần nào, nhưng có lẽ không phải là một ý tưởng tuyệt vời nếu bạn xếp hàng quá nhiều thao tác trước khi gọi thực thi. Điều này về cơ bản được tích tụ trong bộ nhớ và mặc dù trình điều khiển sẽ chỉ gửi hàng loạt 1000 mỗi lần (đây là giới hạn máy chủ cũng như toàn bộ lô dưới 16MB), bạn có thể muốn kiểm soát nhiều hơn một chút ở đây, ít nhất là hạn chế sử dụng bộ nhớ.
Đó là điểm của các bài kiểm tra modulo như được hiển thị, nhưng nếu bộ nhớ để xây dựng các hoạt động và một đối tượng phản hồi có thể thực sự lớn không phải là vấn đề đối với bạn thì bạn có thể tiếp tục xếp hàng các hoạt động và gọi .execute () một lần.
"Phản hồi" có cùng định dạng như được đưa ra trong tài liệu cho BulkWriteResult.