.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 } }
);