Hvis din MongoDB-server er 2.6 eller nyere, ville det være bedre at bruge en skrivekommando Bulk API der giver mulighed for at udføre bulk-indsættelse operationer som blot er abstraktioner oven på serveren for at gøre det nemt at bygge bulk operationer. Disse bulkoperationer kommer hovedsageligt i to varianter:
- Bestilte masseoperationer . Disse operationer udfører hele operationen i rækkefølge og fejl ud på den første skrivefejl.
- Uordrede masseoperationer . Disse operationer udfører alle operationerne parallelt og samler alle fejlene. Uordnede masseoperationer garanterer ikke udførelsesrækkefølgen.
Bemærk, for ældre servere end 2.6 vil API'en nedkonvertere operationerne. Det er dog ikke muligt at nedkonvertere 100 %, så der kan være nogle randtilfælde, hvor den ikke kan rapportere de rigtige tal korrekt.
I dit tilfælde kunne du implementere Bulk API sådan her:
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();
});
}
});
-- OPDATERING --
Kudos til @MarkusWMahlberg, for at generere dummy-indhold, kan du prøve pakken mgenerate .