.find()
"ändrar" inte dokument som returneras på något sätt. Du kan bara "inkludera" eller "utesluta" i projektion.
Det enda som "ändrar" är .aggregate()
eller .mapReduce()
.
För .aggregate()
, kräver MongoDB 3.4 för $strLenCP
eller $strLenBytes
, men vanligtvis menar du det förra:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
För .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Och realistiskt sett i det senare fallet kan du lika gärna iterera markören och kan behöva om inte samlingen är tillräckligt liten eller om du faktiskt kan mata ut till en annan samling istället.
$size
operatorn du försöker använda gäller endast "arrayer" för att returnera antalet poster som finns. Och återigen, det är bara giltigt för användning med .aggregate()
metod.
Om du menar att utelämna tecken som ett space
inom en sträng och sedan en $split
och $reduce
med $concat
kan tillämpas:
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 } }
);