MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Opção de projeção para retornar comprimento/tamanho do campo


.find() não "altera" os documentos devolvidos de forma alguma. Você só pode "incluir" ou "excluir" na projeção.

As únicas coisas que "alteram" são .aggregate() ou .mapReduce() .

Para .aggregate() , requer MongoDB 3.4 para $strLenCP ou $strLenBytes , mas geralmente você quer dizer o primeiro:
db.documents.aggregate([
  { "$project": {
    "bodyLength": { "$strLenCP": "$body" }
  }}
])

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

E, realisticamente, no último caso, você também pode estar iterando o cursor e pode precisar, a menos que a coleção seja pequena o suficiente ou você possa realmente enviar para outra coleção.

O $size operador que você está tentando usar só se aplica a "matrizes" para retornar o número de entradas presentes. E, novamente, só é válido para uso com o .aggregate() método.

Se você pretende omitir caracteres como um space dentro de uma string então um $split e $reduce com $concat pode ser aplicado:
db.documents.aggregate([
  { "$addFields": {
    "bodyLength": {
      "$strLenCP": {
        "$reduce": {
          "input": { "$split": [ "$name", " "] },
          "initialValue": "",
          "in": { "$concat": [ "$$value", "$$this" ] }
        }
      }
    }
  }}
])

Ou novamente com 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 } }
);