Tidak persis, dan maksud saya jika Anda tidak mencari "string yang tepat" dan ingin selalu mengganti dengan string yang "sama" yang berbeda.
Pada dasarnya sepertinya Anda mencari "penggantian regex" untuk dokumen yang dapat dilakukan melalui .update()
. Meskipun dimungkinkan untuk $regex
pencarian, tidak ada "tangkap" atau opsi untuk memasukkan bagian yang diambil ke bagian "perbarui" dari pernyataan seperti $set
.
Jadi untuk melakukan pembaruan semacam ini, Anda perlu mengulang dokumen Anda dan memodifikasi kode. Tetapi API Operasi Massal dapat membantu di sini:
var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;
var query = { "url": { "$regex": "^http://example\.com" }};
db.collection.find(query).forEach(function(doc) {
// Inspect and replace the part of the string
bulk.find({ "_id": doc._id }).updateOne(
{ "$set": { "url": doc.url.replace("example.com","bucket.aws.com") } }
);
counter++;
// Update once every 1000 documents
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
})
// Process any remaining
if ( counter % 1000 != 0 )
bulk.execute();
Sehingga masih memerlukan perulangan namun setidaknya update hanya dikirimkan ke server sekali setiap 1000 dokumen diproses.