Pokud je váš server MongoDB verze 2.6 nebo novější, bylo by lepší využít možnosti zápisu Hromadné API které umožňují provádění operací hromadného vkládání, které jsou pouhými abstrakcemi nad serverem, aby bylo možné snadno vytvářet hromadné operace, a tak získat zvýšení výkonu s vaší aktualizací přes velké kolekce.
Odesílání operací hromadného vkládání v dávkách má za následek menší provoz na serveru, a proto provádí efektivní drátové transakce tím, že neodesílá vše v jednotlivých výpisech, ale spíše se rozděluje na zvládnutelné části pro nasazení serveru. S tímto přístupem je také méně času čekání na odpověď ve zpětném volání.
Tyto hromadné operace přicházejí hlavně ve dvou příchutích:
- Objednané hromadné operace . Tyto operace provedou všechny operace v pořadí a při první chybě zápisu dojde k chybě.
- Neuspořádané hromadné operace . Tyto operace provádějí všechny operace paralelně a shromažďují všechny chyby. Neuspořádané hromadné operace nezaručují pořadí provedení.
Všimněte si, že u starších serverů než 2.6 API převede operace dolů. Není však možné převést dolů 100 %, takže se mohou vyskytnout okrajové případy, kdy nemůže správně hlásit správná čísla.
Ve vašem případě byste mohli implementovat operaci hromadného vložení API v dávkách po 1000 takto:
Pro MongoDB 3.2+ pomocí 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
});
}
};
Pro 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();
});
}
};
Zavolejte createNewEntries()
funkce.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});