Non esattamente, e con questo intendo se non stavi cercando la "stringa esatta" e volevi sostituirla sempre con la "stessa" stringa diversa.
In sostanza sembra che tu stia cercando una "sostituzione regex" per documenti che possono essere eseguiti tramite .update()
. Sebbene sia possibile $regex
ricerca, non c'è "cattura" o opzione per alimentare le parti catturate nella parte "aggiornamento" di una dichiarazione come $set
.
Quindi, per eseguire questo tipo di aggiornamento, devi eseguire il loop dei tuoi documenti e modificarli nel codice. Ma l'API per le operazioni in blocco può essere di aiuto qui:
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();
Ciò richiede ancora il ciclo, ma almeno gli aggiornamenti vengono inviati al server solo una volta ogni 1000 documenti elaborati.