MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Pesquisar e substituir no Mongodb?


Não exatamente, e com isso quero dizer se você não estava procurando a "string exata" e desejando sempre substituir pela "mesma" string diferente.

Essencialmente, parece que você está procurando por uma "substituição de regex" para documentos que podem ser executados via .update() . Embora seja possível $regex search, não há "captura" ou opção para alimentar partes capturadas na parte "atualizar" de uma declaração como $set .

Portanto, para fazer esse tipo de atualização, você precisa fazer um loop em seus documentos e modificar no código. Mas a API de operações em massa pode ser de alguma ajuda aqui:
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();

Portanto, isso ainda requer loop, mas pelo menos as atualizações são enviadas para o servidor apenas uma vez a cada 1.000 documentos processados.