Ако вашият MongoDB сървър е 2.6 или по-нов, би било по-добре да се възползвате от използването на команди за запис Bulk API които позволяват изпълнението на операции за групово вмъкване, които са просто абстракции в горната част на сървъра, за да улеснят изграждането на групови операции и по този начин да получат печалби в производителността с вашата актуализация върху големи колекции.
Изпращането на операциите за групово вмъкване на партиди води до по-малко трафик към сървъра и по този начин извършва ефективни телени транзакции, като не изпраща всичко в отделни отчети, а по-скоро се разделя на управляеми парчета за ангажиране на сървъра. Освен това има по-малко време за изчакване на отговора при обратното извикване с този подход.
Тези групови операции се предлагат главно в два варианта:
- Поръчани масови операции . Тези операции изпълняват всички операции по ред и извеждат грешка при първата грешка при запис.
- Неподредени групови операции . Тези операции изпълняват всички операции паралелно и агрегират всички грешки. Неподредените групови операции не гарантират ред на изпълнение.
Имайте предвид, че за по-стари сървъри от 2.6 API ще преобразува операциите надолу. Въпреки това не е възможно да се преобразува надолу 100%, така че може да има някои крайни случаи, при които не може да отчете правилно точните числа.
Във вашия случай бихте могли да приложите операцията за групово вмъкване на API в партиди от 1000 по следния начин:
За MongoDB 3.2+ използвайки 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
});
}
};
За 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();
});
}
};
Извикайте createNewEntries()
функция.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});