.find()
vrácené dokumenty žádným způsobem „nemění“. V projekci můžete pouze "zahrnout" nebo "vyloučit".
Jediné věci, které se „mění“, jsou .aggregate()
nebo .mapReduce()
.
Pro .aggregate()
, vyžaduje MongoDB 3.4 pro $strLenCP
nebo $strLenBytes
, ale obvykle máte na mysli první:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Pro .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
A realisticky ve druhém případě můžete také iterovat kurzor a možná to budete muset udělat, pokud není kolekce dostatečně malá nebo pokud místo toho nemůžete skutečně vystupovat do jiné kolekce.
$size
Operátor, který se pokoušíte použít, se vztahuje pouze na "pole", aby vrátil počet přítomných položek. A opět platí pouze pro použití s .aggregate()
metoda.
Pokud chcete vynechat znaky, jako je space
v řetězci pak $split
a $reduce
s $concat
lze použít:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Nebo znovu pomocí 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 } }
);