Saat ini pembaruan di MongoDB tidak mungkin untuk merujuk ke nilai yang ada dari bidang saat ini saat menerapkan pembaruan. Jadi, Anda harus mengulang:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
Memperhatikan penggunaan $set
operator di sana dan bidang "kategori" yang diproyeksikan hanya untuk mengurangi lalu lintas jaringan"
Anda dapat membatasi apa yang diproses dengan $regex
untuk mencocokkan:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
Atau bahkan sebagai $regex
pure murni tanpa menggunakan $and
yang hanya Anda perlukan di MongoDB di mana beberapa kondisi akan diterapkan ke bidang yang sama. Jika tidak, $and
tersirat untuk semua argumen:
db.collection.find({ "category": /^\s+|\s+$/ })
Yang membatasi dokumen yang cocok untuk diproses hanya untuk dokumen dengan spasi putih di depan atau di belakang.
Jika Anda khawatir tentang jumlah dokumen yang harus dilihat, pembaruan massal akan membantu jika Anda memiliki MongoDB 2.6 atau lebih tinggi yang tersedia:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": { "$set": { "category": doc.catetgory.trim() } }
});
if ( batch.length % 1000 == 0 ) {
db.runCommand("update", batch);
batch = [];
}
}
);
if ( batch.length > 0 )
db.runCommand("update", batch);
Atau bahkan dengan API operasi massal untuk MongoDB 2.6 dan yang lebih baru:
var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
bulk.find({ "_id": doc._id }).update({
"$set": { "category": doc.category.trim() }
});
counter = counter + 1;
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
}
);
if ( counter > 1 )
bulk.execute();
Terbaik selesai dengan bulkWrite()
untuk API modern yang menggunakan API Operasi Massal ( secara teknis semuanya lakukan sekarang ) tetapi sebenarnya dengan cara yang regresif dengan aman dengan versi MongoDB yang lebih lama. Meskipun sejujurnya itu berarti sebelum MongoDB 2.6 dan Anda akan jauh dari jangkauan untuk opsi dukungan resmi menggunakan versi seperti itu. Pengkodean agak lebih bersih untuk ini:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
batch.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "category": doc.category.trim() } }
}
});
if ( batch.legth % 1000 == 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
}
);
if ( batch.length > 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
Yang semuanya hanya mengirim operasi ke server sekali per 1000 dokumen, atau modifikasi sebanyak yang Anda bisa muat di bawah batas BSON 64MB.
Sebagai hanya beberapa cara untuk mendekati masalah. Atau perbarui file CSV Anda terlebih dahulu sebelum mengimpor.