Jeśli twój serwer MongoDB ma wersję 2.6 lub nowszą, lepiej skorzystać z poleceń zapisu Bulk API które umożliwiają wykonywanie operacji wstawiania zbiorczego, które są po prostu abstrakcjami na wierzchu serwera, aby ułatwić tworzenie operacji zbiorczych, a tym samym uzyskać wzrost wydajności dzięki aktualizacji w dużych kolekcjach.
Wysyłanie zbiorczych operacji wstawiania w partiach skutkuje mniejszym ruchem na serwerze, a tym samym wykonuje wydajne transakcje przelewowe, nie wysyłając wszystkiego w osobnych instrukcjach, ale raczej dzieląc się na łatwe do zarządzania fragmenty w celu zaangażowania serwera. Przy takim podejściu jest również mniej czasu oczekiwania na odpowiedź w wywołaniu zwrotnym.
Te operacje masowe występują głównie w dwóch wariantach:
- Zamówione operacje zbiorcze . Te operacje wykonują wszystkie operacje w kolejności i błędach przy pierwszym błędzie zapisu.
- Nieuporządkowane operacje zbiorcze . Operacje te wykonują wszystkie operacje równolegle i agregują wszystkie błędy. Nieuporządkowane operacje zbiorcze nie gwarantują kolejności wykonania.
Uwaga, w przypadku serwerów starszych niż 2.6 interfejs API przekonwertuje operacje w dół. Jednak nie jest możliwe przekonwertowanie w dół w 100%, więc mogą wystąpić pewne skrajne przypadki, w których nie będzie można poprawnie zgłosić prawidłowych liczb.
W Twoim przypadku możesz zaimplementować operację wstawiania Bulk API w partiach po 1000, tak jak poniżej:
Dla MongoDB 3.2+ przy użyciu 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
});
}
};
Dla 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();
});
}
};
Wywołaj createNewEntries()
funkcja.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});