sql >> Databasteknik >  >> NoSQL >> MongoDB

Hitta och ersätt strängar i dokument effektivt

Säkert om allt du vill göra är att ta bort   enheter från din text så gör du bara en global matchning och ersätter:

db.tests.find({ "name": /\ /g }).forEach(function(doc) {
    doc.name = doc.name.replace(/ /g,"");
    db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});

Så det borde inte finnas något behov av att skriva ut varje kombination, regexet kommer att ersätta mycket matchande med /g alternativ. Använd eventuellt även /m för flera rader är din "namn"-sträng som innehåller nyradstecken. Se ett grundläggande regexerexempel .

Det rekommenderas även att använda $set för att bara ändra de fält du verkligen vill istället för .save() hela dokumentet tillbaka. Det finns mindre trafik och mindre chans att skriva över ändringar som kan ha gjorts av en annan process sedan dokumentet lästes.

Helst skulle du använda Bulk Operations API med MongoDB version 2.6 och senare. Detta gör att uppdateringarna "batchar" så att det återigen blir mindre trafik mellan klienten och servern:

var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;

db.tests.find({ "name": /\ /g }).forEach(function(doc) {
    doc.name = doc.name.replace(/ /g,"");
    bulk.find({ "_id": doc._id })
        .updateOne({ "$set": { "name": doc.name } });
    count++;

    if ( count % 1000 == 0 ) {
        bulk.execute();
        bulk = db.tests.initializeOrderedBulkOp();
    }
});

if  ( count % 1000 != 0 )
    bulk.execute();

Det är dina primära sätt att förbättra detta. Tyvärr finns det inget sätt för en MongoDB-uppdateringssats att använda ett befintligt värde som en del av dess uppdateringsuttryck på detta sätt, så det enda sättet är looping, men du kan göra mycket för att minska operationerna som visas.



  1. mongodb misslyckades:fel vid anslutning till db-server:inga servrar som kan nås

  2. 'session' är odefinierad när du använder express / redis för session store

  3. MongoDB:mongoimport tappar anslutningen vid import av stora filer

  4. C# MongoDB-drivrutin - Hur använder man UpdateDefinitionBuilder?