Si votre serveur MongoDB est 2.6 ou plus récent, il serait préférable de profiter de l'utilisation d'une commande d'écriture API de masse qui permettent l'exécution de insertion en masse opérations qui sont simplement des abstractions au-dessus du serveur pour faciliter la création d'opérations en bloc. Ces opérations groupées se présentent principalement sous deux formes :
- Opérations groupées ordonnées . Ces opérations exécutent toutes les opérations dans l'ordre et génèrent une erreur à la première erreur d'écriture.
- Opérations groupées non ordonnées . Ces opérations exécutent toutes les opérations en parallèle et agrègent toutes les erreurs. Les opérations en bloc non ordonnées ne garantissent pas l'ordre d'exécution.
Notez que pour les serveurs plus anciens que 2.6, l'API convertira les opérations. Cependant, il n'est pas possible de convertir à 100 %, il peut donc y avoir des cas extrêmes où il ne peut pas rapporter correctement les bons chiffres.
Dans votre cas, vous pouvez implémenter l'API de masse comme ceci :
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();
});
}
});
-- MISE À JOUR --
Félicitations à @MarkusWMahlberg, pour avoir généré du contenu factice, vous pouvez essayer le package mgenerate .