MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Rechercher et remplacer dans Mongodb ?

Pas exactement, et j'entends par là si vous ne cherchiez pas la "chaîne exacte" et que vous vouliez toujours remplacer par la "même" chaîne différente.

Essentiellement, il semble que vous recherchiez un "remplacement de regex" pour les documents pouvant être exécutés via .update() . Bien qu'il soit possible de $regex recherche, il n'y a pas de "capture" ou d'option pour alimenter les parties capturées dans la partie "mise à jour" d'une déclaration telle que $set .

Donc, pour faire ce genre de mise à jour, vous devez boucler vos documents et modifier le code. Mais l'API d'opérations en masse peut être utile ici :

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

Cela nécessite donc toujours une boucle mais au moins les mises à jour ne sont envoyées au serveur qu'une fois tous les 1000 documents traités.