.find()
"wijzigt" de geretourneerde documenten op geen enkele manier. U kunt alleen "opnemen" of "uitsluiten" in projectie.
De enige dingen die "veranderen" zijn .aggregate()
of .mapReduce()
.
Voor .aggregate()
, vereist MongoDB 3.4 voor $strLenCP
of $strLenBytes
, maar meestal bedoel je de eerste:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Voor .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
En realistisch gezien, in het laatste geval, kunt u net zo goed de cursor herhalen, en dit kan nodig zijn, tenzij de verzameling klein genoeg is of u in plaats daarvan naar een andere verzameling kunt uitvoeren.
De $size
operator die u probeert te gebruiken, is alleen van toepassing op "arrays" om het aantal aanwezige vermeldingen te retourneren. En nogmaals, het is alleen geldig voor gebruik met de .aggregate()
methode.
Als u tekens wilt weglaten, zoals een space
binnen een string dan een $split
en $reduce
met $concat
kan worden toegepast:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Of opnieuw met 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 } }
);