Jika server MongoDB Anda adalah 2.6 atau lebih baru, akan lebih baik untuk menggunakan perintah tulis API Massal
yang memungkinkan eksekusi massal update
operasi yang hanya abstraksi di atas server untuk memudahkan membangun operasi massal. 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.
Untuk tiga kasus penggunaan umum Anda, Anda dapat mengimplementasikan API Massal seperti ini:
Kasus 1. Ubah jenis nilai properti, tanpa mengubah nilainya:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 1. Change type of value of property, without changing the value.
col.find({"timestamp": {"$exists": true, "$type": 2} }).each(function (err, doc) {
var newTimestamp = parseInt(doc.timestamp);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "timestamp": newTimestamp }
});
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();
});
}
});
Kasus 2. Tambahkan properti baru berdasarkan nilai properti yang ada:
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 2. Add new property based on value of existing property.
col.find({"name": {"$exists": false } }).each(function (err, doc) {
var fullName = doc.firstname + " " doc.lastname;
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "name": fullName }
});
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();
});
}
});
Kasus 3. Cukup menambahkan properti penghapusan dari dokumen.
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 3. Simply adding removing properties from documents.
col.find({"street_no": {"$exists": true } }).each(function (err, doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "no": doc.street_no },
"$unset": { "street_no": "" }
});
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();
});
}
});