Tentunya jika yang ingin Anda lakukan hanyalah menghapus
entitas dari teks Anda maka Anda cukup melakukan pencocokan global dan mengganti:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
Jadi tidak perlu menuliskan setiap kombinasi, regex akan diganti sangat cocok dengan /g
pilihan. Mungkin juga menggunakan /m
untuk multi-baris adalah string "nama" Anda berisi karakter baris baru. Lihat contoh regexer dasar
dasar .
Juga disarankan untuk menggunakan $set
untuk hanya mengubah bidang yang benar-benar Anda inginkan daripada .save()
seluruh dokumen kembali. Ada lebih sedikit lalu lintas dan lebih sedikit peluang untuk menimpa perubahan yang mungkin dibuat oleh proses lain sejak dokumen dibaca.
Idealnya Anda akan menggunakan Bulk Operations API dengan MongoDB versi 2.6 dan yang lebih baru. Ini memungkinkan pembaruan untuk "batch" sehingga ada lebih sedikit lalu lintas antara klien dan server:
var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
bulk.find({ "_id": doc._id })
.updateOne({ "$set": { "name": doc.name } });
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.tests.initializeOrderedBulkOp();
}
});
if ( count % 1000 != 0 )
bulk.execute();
Itu adalah cara utama Anda untuk meningkatkan ini. Sayangnya tidak ada cara untuk pernyataan pembaruan MongoDB untuk menggunakan nilai yang ada sebagai bagian dari ekspresi pembaruannya dengan cara ini, jadi satu-satunya cara adalah mengulang, tetapi Anda dapat melakukan banyak hal untuk mengurangi operasi seperti yang ditunjukkan.