.find()
w żaden sposób nie "zmienia" zwracanych dokumentów. W projekcji możesz tylko „włączyć” lub „wykluczyć”.
Jedyne, co "zmienia" to .aggregate()
lub .mapReduce()
.
Dla .aggregate()
, wymaga MongoDB 3.4 dla $strLenCP
lub $strLenBytes
, ale zwykle masz na myśli to pierwsze:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Dla .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Realistycznie rzecz biorąc, w tym drugim przypadku możesz równie dobrze iterować kursor i może być to konieczne, chyba że kolekcja jest wystarczająco mała lub zamiast tego możesz wyświetlić inną kolekcję.
$size
Operator, którego próbujesz użyć, dotyczy tylko "tablic", aby zwrócić liczbę obecnych wpisów. I znowu, jest to ważne tylko do użycia z .aggregate()
metoda.
Jeśli chcesz pominąć znaki takie jak space
w ciągu, a następnie $split
i $reduce
z $concat
można zastosować:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Lub ponownie za 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 } }
);