.find()
"ændrer" ikke returnerede dokumenter på nogen måde. Du kan kun "inkludere" eller "udelukke" i projektion.
De eneste ting, der "ændrer" er .aggregate()
eller .mapReduce()
.
For .aggregate()
, kræver MongoDB 3.4 til $strLenCP
eller $strLenBytes
, men normalt mener du førstnævnte:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
For .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Og realistisk set i sidstnævnte tilfælde kan du lige så godt gentage markøren, og det kan være nødvendigt, medmindre samlingen er lille nok, eller du faktisk kan udskrive til en anden samling i stedet for.
$size
operator du forsøger at bruge gælder kun for "arrays" for at returnere antallet af tilstedeværende poster. Og igen, det er kun gyldigt til brug med .aggregate()
metode.
Hvis du mener at udelade tegn såsom et space
inden for en streng og derefter en $split
og $reduce
med $concat
kan anvendes:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Eller igen med 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 } }
);