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

Opzione di proiezione per restituire la lunghezza/dimensione del campo

.find() non "altera" in alcun modo i documenti restituiti. Puoi solo "includere" o "escludere" nella proiezione.

Le uniche cose che "alterano" sono .aggregate() o .mapReduce() .

Per .aggregate() , richiede MongoDB 3.4 per $strLenCP o $strLenBytes , ma di solito intendi il primo:

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

Per .mapReduce()

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

E realisticamente in quest'ultimo caso, potresti anche iterare il cursore e potrebbe essere necessario a meno che la raccolta non sia sufficientemente piccola o tu possa effettivamente eseguire l'output su un'altra raccolta.

Il $size l'operatore che stai tentando di utilizzare si applica solo agli "array" per restituire il numero di voci presenti. E ancora, è valido solo per l'utilizzo con .aggregate() metodo.

Se intendi omettere caratteri come uno space all'interno di una stringa quindi un $split e $reduce con $concat può essere applicato:

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

O ancora 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 } }
);