MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Projektionsoption zur Rückgabe der Feldlänge/-größe

.find() „verändert“ die zurückgegebenen Dokumente in keiner Weise. Sie können die Projektion nur "einschließen" oder "ausschließen".

Die einzigen Dinge, die "verändert" werden, sind .aggregate() oder .mapReduce() .

Für .aggregate() , erfordert MongoDB 3.4 für $strLenCP oder $strLenBytes , aber normalerweise meinst du ersteres:

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

Für .mapReduce()

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

Und im letzteren Fall können Sie realistischerweise auch den Cursor durchlaufen und müssen dies möglicherweise tun, es sei denn, die Sammlung ist klein genug oder Sie können stattdessen tatsächlich in eine andere Sammlung ausgeben.

Der $size Operator, den Sie zu verwenden versuchen, gilt nur für "Arrays", um die Anzahl der vorhandenen Einträge zurückzugeben. Und wieder gilt es nur für die Verwendung mit .aggregate() Methode.

Wenn Sie Zeichen wie ein space auslassen möchten innerhalb einer Zeichenfolge dann ein $split und $reduce mit $concat anwendbar:

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

Oder wieder mit 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 } }
);