MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Option de projection pour renvoyer la longueur/taille du champ

.find() ne "modifie" en aucun cas les documents retournés. Vous pouvez uniquement "inclure" ou "exclure" dans la projection.

Les seules choses qui "modifient" sont .aggregate() ou .mapReduce() .

Pour .aggregate() , nécessite MongoDB 3.4 pour $strLenCP ou $strLenBytes , mais généralement vous voulez dire le premier :

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

Pour .mapReduce()

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

Et de manière réaliste, dans ce dernier cas, vous pouvez également itérer le curseur, et vous devrez peut-être le faire à moins que la collection ne soit suffisamment petite ou que vous puissiez réellement sortir vers une autre collection à la place.

Le $size L'opérateur que vous essayez d'utiliser ne s'applique qu'aux "tableaux" pour renvoyer le nombre d'entrées présentes. Et encore une fois, il n'est valable que pour une utilisation avec le .aggregate() méthode.

Si vous voulez omettre des caractères tels qu'un space dans une chaîne puis un $split et $reduce avec $concat peut être appliqué :

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

Ou encore avec 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 } }
);