Nếu máy chủ MongoDB của bạn là 2.6 hoặc mới hơn, tốt hơn nên tận dụng lợi thế của việc sử dụng lệnh ghi Bulk API cho phép thực hiện các thao tác chèn hàng loạt, đơn giản là các thao tác trừu tượng trên đầu máy chủ để giúp dễ dàng xây dựng các thao tác hàng loạt và do đó nhận được hiệu suất tăng với bản cập nhật của bạn trên các bộ sưu tập lớn.
Gửi các hoạt động chèn hàng loạt theo lô dẫn đến ít lưu lượng truy cập đến máy chủ hơn và do đó thực hiện các giao dịch chuyển khoản 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 phần có thể quản lý cho cam kết của máy chủ. Cũng có ít thời gian hơn để chờ phản hồi trong lệnh gọi lại với cách tiếp cận này.
Các hoạt động hàng loạt này chủ yếu có hai loại:
- Hoạt động hàng loạt có thứ tự . Các thao tác này thực hiện tất cả các thao tác theo thứ tự và không xảy ra lỗi khi ghi đầu tiên.
- Hoạt động hàng loạt không có thứ tự . Các hoạt động này thực hiện tất cả các hoạt động song song và tổng hợp tất cả các lỗi. Các hoạt động hàng loạt không theo thứ tự không đảm bảo thứ tự thực hiện.
Lưu ý, đối với các máy chủ cũ hơn 2.6, API sẽ chuyển đổi các hoạt động xuống. Tuy nhiên, không thể downconvert 100% vì vậy có thể có một số trường hợp phức tạp trong đó nó không thể báo cáo chính xác các con số phù hợp.
Trong trường hợp của bạn, bạn có thể triển khai hoạt động chèn Bulk API theo lô 1000 như thế này:
Đối với MongoDB 3.2+ sử dụng bulkWrite
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulkUpdateOps = [];
entries.forEach(function(doc) {
bulkUpdateOps.push({ "insertOne": { "document": doc } });
if (bulkUpdateOps.length === 1000) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
bulkUpdateOps = [];
}
})
if (bulkUpdateOps.length > 0) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
}
};
Đối với MongoDB <3.2
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Execute the forEach method, triggers for each entry in the array
entries.forEach(function(obj) {
bulk.insert(obj);
counter++;
if (counter % 1000 == 0 ) {
// Execute the operation
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = collection.initializeOrderedBulkOp();
callback();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
callback();
});
}
};
Gọi createNewEntries()
chức năng.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});