sql >> Database >  >> NoSQL >> MongoDB

Projectie-optie om de lengte/grootte van het veld terug te geven

.find() "wijzigt" de geretourneerde documenten op geen enkele manier. U kunt alleen "opnemen" of "uitsluiten" in projectie.

De enige dingen die "veranderen" zijn .aggregate() of .mapReduce() .

Voor .aggregate() , vereist MongoDB 3.4 voor $strLenCP of $strLenBytes , maar meestal bedoel je de eerste:

db.documents.aggregate([
  { "$project": {
    "bodyLength": { "$strLenCP": "$body" }
  }}
])

Voor .mapReduce()

db.documents.mapReduce(
  function() {
    emit(this._id, this.body.length)
  },
  function() { },
  { "out": { "inline": 1 } }
);

En realistisch gezien, in het laatste geval, kunt u net zo goed de cursor herhalen, en dit kan nodig zijn, tenzij de verzameling klein genoeg is of u in plaats daarvan naar een andere verzameling kunt uitvoeren.

De $size operator die u probeert te gebruiken, is alleen van toepassing op "arrays" om het aantal aanwezige vermeldingen te retourneren. En nogmaals, het is alleen geldig voor gebruik met de .aggregate() methode.

Als u tekens wilt weglaten, zoals een space binnen een string dan een $split en $reduce met $concat kan worden toegepast:

db.documents.aggregate([
  { "$addFields": {
    "bodyLength": {
      "$strLenCP": {
        "$reduce": {
          "input": { "$split": [ "$name", " "] },
          "initialValue": "",
          "in": { "$concat": [ "$$value", "$$this" ] }
        }
      }
    }
  }}
])

Of opnieuw met mapReduce() :

db.documents.mapReduce(
  function() {
    emit(this._id, "".concat.apply(this.body.split(" ")).length)
    // Or even
    // emit(this._id, this.body.split(" ").reduce((o,e) => o.concat(e),"").length)
  },
  function() { },
  { "out": { "inline": 1 } }
);



  1. docker-compose onderdrukken mongodb-uitvoer

  2. Selecteer records die overeenkomen met de concat-waarde van twee velden in mongodb

  3. Spring Data MongoDB en allowDiskUse

  4. Waarom Mongodb-prestaties beter op Linux dan op Windows?