Не точно и с това имам предвид, ако не търсите „точния низ“ и искате винаги да заменяте със „същия“ различен низ.
По същество изглежда, че търсите "regex replace" за документи, които могат да бъдат изпълнени чрез .update()
. Въпреки че е възможно да $regex
търсене, няма „улавяне“ или опция за подаване на уловени части към частта „актуализация“ на израз като $set
.
Така че, за да направите този вид актуализация, трябва да завъртите вашите документи и да промените кода. Но API за групови операции може да бъде от полза тук:
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();
Така че това все още изисква зацикляне, но поне актуализациите се изпращат до сървъра само веднъж на всеки 1000 обработени документа.