Jeśli twój serwer MongoDB ma wersję 2.6 lub nowszą, lepiej skorzystać z poleceń zapisu Bulk API które pozwalają na wykonanie bulk insert operacje, które są po prostu abstrakcjami na wierzchu serwera, aby ułatwić tworzenie operacji zbiorczych. 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ć Bulk API tak:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/course", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('students'),
types = ['exam', 'quiz', 'homework', 'homework'],
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Drop the collection
col.drop();
// Representing a long loop with 1 Million Records
for (var i = 0; i < 1000000; i++) {
var scores = [],
class_id = 0,
record = {};
// Each student taking 10 classes
for (var class_counter = 0; class_counter < 10; class_counter ++) {
// Each Class has 4 grades
// and each class has 4 grades
for (var j = 0; j < 4; j++) {
scores.push({ 'type': types[j], 'score': Math.random()*100 });
}
// there are 500 different classes that they can take
class_id = Math.floor(Math.random() * 501); // get a class id between 0 and 500
record['student_id'] = i;
record['scores'] = scores;
record['class_id'] = class_id;
}
bulk.insert(record);
counter++;
if (counter % 1000 == 0 ) {
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = col.initializeOrderedBulkOp();
});
}
}
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
db.close();
});
}
});
-- AKTUALIZACJA --
Chwała dla @MarkusWMahlberg, za generowanie fikcyjnych treści możesz wypróbować pakiet mgenerate .