sql >> Base de Datos >  >> NoSQL >> MongoDB

Opción de proyección para devolver la longitud/tamaño del campo

.find() no "altera" los documentos devueltos de ninguna manera. Solo puede "incluir" o "excluir" en la proyección.

Las únicas cosas que "alteran" son .aggregate() o .mapReduce() .

Para .aggregate() , requiere MongoDB 3.4 para $strLenCP o $strLenBytes , pero por lo general te refieres a lo primero:

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

Para .mapReduce()

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

Y, de manera realista, en el último caso, también puede estar iterando el cursor, y es posible que lo necesite, a menos que la colección sea lo suficientemente pequeña o que pueda generar otra colección en su lugar.

El $size El operador que está intentando usar solo se aplica a "matrices" para devolver el número de entradas presentes. Y nuevamente, solo es válido para usar con .aggregate() método.

Si quiere omitir caracteres como un space dentro de una cadena, entonces un $split y $reduce con $concat se puede aplicar:

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

O de nuevo con 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 } }
);