Nie do końca, mam na myśli to, że nie szukałeś „dokładnego ciągu” i chciałeś zawsze zastąpić go „tym samym” innym ciągiem.
Zasadniczo wygląda na to, że szukasz „zamiennika wyrażenia regularnego” dla dokumentów, które można wykonać za pomocą .update()
. Chociaż możliwe jest $regex
wyszukiwania, nie ma opcji „przechwytywania” ani opcji przesyłania przechwyconych części do części „aktualizacji” instrukcji, takiej jak $set
.
Aby dokonać tego rodzaju aktualizacji, musisz zapętlić swoje dokumenty i zmodyfikować kod. Ale Interfejs API operacji zbiorczych może być tutaj pomocna:
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();
Tak więc nadal wymaga to zapętlenia, ale przynajmniej aktualizacje są wysyłane na serwer tylko raz na 1000 przetworzonych dokumentów.