sql >> Database teknologi >  >> NoSQL >> MongoDB

Find og erstat strenge i dokumenter effektivt

Sikkert, hvis alt du vil gøre er at fjerne   enheder fra din tekst, så laver du bare et globalt match og erstatter:

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å der skulle ikke være behov for at skrive hver kombination ud, regex vil erstatte meget match med /g mulighed. Brug eventuelt også /m for multi-line er din "navn" streng indeholder newline tegn. Se et grundlæggende regexer-eksempel .

Det anbefales også at bruge $set for kun at ændre det eller de felter, du virkelig vil i stedet for .save() hele dokumentet tilbage. Der er mindre trafik og mindre chance for at overskrive ændringer, der kunne være foretaget af en anden proces, siden dokumentet blev læst.

Ideelt set ville du bruge Bulk Operations API med MongoDB version 2.6 og nyere. Dette tillader opdateringerne at "batch" så der igen er mindre trafik mellem klienten og serveren:

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 er dine primære måder at forbedre dette på. Desværre er der ingen måde for en MongoDB-opdateringssætning at bruge en eksisterende værdi som en del af dets opdateringsudtryk på denne måde, så den eneste måde er looping, men du kan gøre meget for at reducere operationerne som vist.



  1. kan ikke hente data fra vinkel http

  2. MongoDB $replaceOne

  3. Hvordan kan jeg få optællingen af ​​nøgler i redis?

  4. mongodb connect ved hjælp af php