Niet precies, en daarmee bedoel ik als je niet op zoek bent naar de "exacte tekenreeks" en altijd wilt vervangen door de "dezelfde" andere tekenreeks.
In wezen lijkt het erop dat u op zoek bent naar een "regex-vervanging" voor documenten die kan worden uitgevoerd via .update()
. Hoewel het mogelijk is om $regex
zoeken, is er geen "capture" of optie om vastgelegde delen toe te voegen aan het "update"-gedeelte van een instructie zoals $set
.
Dus om dit soort updates uit te voeren, moet u uw documenten herhalen en in code wijzigen. Maar de Bulk Operations API kan hier van dienst zijn:
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();
Dus dat vereist nog steeds een lus, maar de updates worden in ieder geval maar één keer per 1000 verwerkte documenten naar de server gestuurd.