Ne přesně, a tím myslím, pokud jste nehledali "přesný řetězec" a chtěli ho vždy nahradit "stejným" jiným řetězcem.
V podstatě to vypadá, že hledáte "nahrazení regulárního výrazu" pro dokumenty, které lze provést pomocí .update()
. I když je možné $regex
vyhledávání, neexistuje žádné „zachycení“ nebo možnost vložit zachycené části do části „aktualizace“ prohlášení, jako je $set
.
Chcete-li tedy provést tento druh aktualizace, musíte zacyklit své dokumenty a upravit kód. Ale Bulk Operations API může vám pomoci zde:
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();
Stále to tedy vyžaduje smyčkování, ale alespoň aktualizace se na server odesílají pouze jednou za každých 1000 zpracovaných dokumentů.