MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Cercare e sostituire in Mongodb?

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.