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

Fjernelse af hvide mellemrum (førende og efterfølgende) fra strengværdi

Det er i øjeblikket ikke muligt for en opdatering i MongoDB at henvise til den eksisterende værdi af et aktuelt felt, når opdateringen anvendes. Så du bliver nødt til at sløjfe:

db.collection.find({},{ "category": 1 }).forEach(function(doc) {
   doc.category = doc.category.trim();
   db.collection.update(
       { "_id": doc._id },
       { "$set": { "category": doc.category } }
   );
})

Bemærk brugen af ​​$set operatør der og det forventede "kategori" felt kun for at reducere netværkstrafikken"

Du kan muligvis begrænse, hvad det behandler med en $regex at matche:

db.collection.find({ 
    "$and": [
        { "category": /^\s+/ },
        { "category": /\s+$/ }
    ]
})

Eller endda som ren $regex uden brug af $and som du kun har brug for i MongoDB, hvor flere betingelser ville blive anvendt på det samme felt. Ellers $and er implicit for alle argumenter:

db.collection.find({ "category": /^\s+|\s+$/ })

Hvilket begrænser de matchede dokumenter til kun at behandle dem med indledende eller efterstillede mellemrum.

Hvis du er bekymret for antallet af dokumenter, du skal se, burde masseopdatering hjælpe, hvis du har MongoDB 2.6 eller nyere tilgængelig:

var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
    function(doc) {
        batch.push({
            "q": { "_id": doc._id },
            "u": { "$set": { "category": doc.catetgory.trim() } }
        });

        if ( batch.length % 1000 == 0 ) {
            db.runCommand("update", batch);
            batch = [];
        }
    }
);

if ( batch.length > 0 )
    db.runCommand("update", batch);

Eller endda med bulk operations API for MongoDB 2.6 og nyere:

var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
    function(doc) {
        bulk.find({ "_id": doc._id }).update({
            "$set": { "category": doc.category.trim() }
        });
        counter = counter + 1;

        if ( counter % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    }
);

if ( counter > 1 )
    bulk.execute();

Bedst udført med bulkWrite() til moderne API'er, som bruger Bulk Operations API (teknisk alt gør nu ), men faktisk på en måde, der er sikkert regressiv med ældre versioner af MongoDB. Selvom det helt ærligt ville betyde før MongoDB 2.6, og du ville være langt ude af dækning for officielle supportmuligheder ved at bruge sådan en version. Kodningen er noget renere til dette:

var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
  function(doc) {
    batch.push({
      "updateOne": {
        "filter": { "_id": doc._id },
        "update": { "$set": { "category": doc.category.trim() } }
      }
    });

    if ( batch.legth % 1000 == 0 ) {
      db.collection.bulkWrite(batch);
      batch = [];
    }
  }
);

if ( batch.length > 0 ) {
  db.collection.bulkWrite(batch);
  batch = [];
}

Som alle kun sender operationer til serveren én gang 1000 dokumenter, eller så mange ændringer, som du kan få plads til under BSON-grænsen på 64 MB.

Som blot et par måder at gribe problemet an på. Eller opdater din CSV-fil først, før du importerer.



  1. MongoDB gruppe og sum med id som nøgle

  2. Redis under klassisk ASP(VBScript)

  3. Angiv flere kriterier for matrixelementer

  4. Redis:Vis databasestørrelse/størrelse for nøgler