sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Buscar y reemplazar en Mongodb?

No exactamente, y con eso quiero decir si no estaba buscando la "cadena exacta" y deseaba reemplazarla siempre con la "misma" cadena diferente.

Esencialmente, parece que está buscando un "reemplazo de expresiones regulares" para documentos que se pueden realizar a través de .update() . Si bien es posible $regex búsqueda, no hay una "captura" ni una opción para alimentar las partes capturadas a la parte de "actualización" de una declaración como $set .

Entonces, para hacer este tipo de actualización, debe hacer un bucle en sus documentos y modificar el código. Pero la API de operaciones masivas puede ser de alguna ayuda aquí:

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();

Eso todavía requiere un bucle, pero al menos las actualizaciones solo se envían al servidor una vez cada 1000 documentos procesados.