Jika server MongoDB Anda adalah 2.6 atau lebih baru, akan lebih baik untuk memanfaatkan menggunakan perintah tulis API Massal yang memungkinkan eksekusi operasi penyisipan massal yang hanya abstraksi di atas server untuk memudahkan membangun operasi massal dan dengan demikian mendapatkan peningkatan kinerja dengan pembaruan Anda pada koleksi besar.
Mengirim operasi penyisipan massal dalam batch menghasilkan lebih sedikit lalu lintas ke server dan dengan demikian melakukan transaksi kawat yang efisien dengan tidak mengirim semuanya dalam pernyataan individual, melainkan memecah menjadi potongan yang dapat dikelola untuk komitmen server. Ada juga lebih sedikit waktu menunggu respons dalam panggilan balik dengan pendekatan ini.
Operasi massal ini datang terutama dalam dua rasa:
- Operasi massal yang dipesan . Operasi ini menjalankan semua operasi secara berurutan dan kesalahan pada kesalahan penulisan pertama.
- Operasi massal tidak berurutan . Operasi ini menjalankan semua operasi secara paralel dan mengumpulkan semua kesalahan. Operasi massal yang tidak berurutan tidak menjamin urutan eksekusi.
Catatan, untuk server yang lebih lama dari 2.6, API akan menurunkan konversi operasi. Namun tidak mungkin untuk menurunkan konversi 100% sehingga mungkin ada beberapa kasus tepi di mana ia tidak dapat melaporkan angka yang benar dengan benar.
Dalam kasus Anda, Anda dapat mengimplementasikan operasi penyisipan API Massal dalam kumpulan 1000 seperti ini:
Untuk MongoDB 3.2+ menggunakan 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
});
}
};
Untuk 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();
});
}
};
Panggil createNewEntries()
fungsi.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});