sql >> Database >  >> NoSQL >> MongoDB

Zoeken en vervangen in Mongodb?

Niet precies, en daarmee bedoel ik als je niet op zoek bent naar de "exacte tekenreeks" en altijd wilt vervangen door de "dezelfde" andere tekenreeks.

In wezen lijkt het erop dat u op zoek bent naar een "regex-vervanging" voor documenten die kan worden uitgevoerd via .update() . Hoewel het mogelijk is om $regex zoeken, is er geen "capture" of optie om vastgelegde delen toe te voegen aan het "update"-gedeelte van een instructie zoals $set .

Dus om dit soort updates uit te voeren, moet u uw documenten herhalen en in code wijzigen. Maar de Bulk Operations API kan hier van dienst zijn:

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

Dus dat vereist nog steeds een lus, maar de updates worden in ieder geval maar één keer per 1000 verwerkte documenten naar de server gestuurd.



  1. Redis-server stoppen. Noch afsluiten, noch stoppen werkt

  2. MongoDB-veldvolgorde en documentpositie wijzigen na update

  3. Garandeert MongoDB-journaling duurzaamheid?

  4. Mongoose paginering en filters