Ikke ligefrem, og med det mener jeg, hvis du ikke ledte efter den "nøjagtige streng" og altid ville erstatte med den "samme" forskellige streng.
Grundlæggende ser det ud til, at du leder efter en "regex-erstatning" for dokumenter, der kan udføres via .update()
. Selvom det er muligt at $regex
søgning, er der ingen "capture" eller mulighed for at feed opfangede dele til "update"-delen af en erklæring såsom $set
.
Så for at lave denne form for opdatering skal du sløjfe dine dokumenter og ændre i kode. Men Bulk Operations API kan være til hjælp her:
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();
Så det kræver stadig looping, men i det mindste sendes opdateringerne kun til serveren én gang for hver 1000 behandlede dokumenter.