Nếu máy chủ MongoDB của bạn là 2.6 hoặc mới hơn, tốt hơn nên tận dụng lợi thế của việc sử dụng lệnh ghi Bulk API cho phép thực thi chèn hàng loạt các thao tác chỉ đơn giản là các thao tác trừu tượng trên máy chủ để dễ dàng tạo các thao tác hàng loạt. Các hoạt động hàng loạt này chủ yếu có hai loại:
- Hoạt động hàng loạt có thứ tự . Các thao tác này thực hiện tất cả các thao tác theo thứ tự và không xảy ra lỗi khi ghi đầu tiên.
- Hoạt động hàng loạt không có thứ tự . Các hoạt động này thực hiện tất cả các hoạt động song song và tổng hợp tất cả các lỗi. Các hoạt động hàng loạt không theo thứ tự không đảm bảo thứ tự thực hiện.
Lưu ý, đối với các máy chủ cũ hơn 2.6, API sẽ chuyển đổi các hoạt động xuống. Tuy nhiên, không thể downconvert 100% vì vậy có thể có một số trường hợp phức tạp trong đó nó không thể báo cáo chính xác các con số phù hợp.
Trong trường hợp của mình, bạn có thể triển khai API hàng loạt như thế này:
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();
});
}
});
- CẬP NHẬT -
Kudos đối với @MarkusWMahlberg, để tạo nội dung giả, bạn có thể muốn dùng thử gói mgenerate .