.find()
не "променя" върнатите документи по никакъв начин. Можете само да „включите“ или „изключите“ в проекцията.
Единствените неща, които „променят“ са .aggregate()
или .mapReduce()
.
За .aggregate()
, изисква MongoDB 3.4 за $strLenCP
или $strLenBytes
, но обикновено имате предвид първото:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
За .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
И реалистично в последния случай, вие също може да повторите курсора и може да се наложи, освен ако колекцията не е достатъчно малка или всъщност можете да извеждате към друга колекция вместо това.
$size
операторът, който се опитвате да използвате, се отнася само за "масиви", за да върне броя на наличните записи. И отново, това е валидно само за използване с .aggregate()
метод.
Ако искате да пропуснете знаци като space
в рамките на низ, след това $split
и $reduce
с $concat
може да се приложи:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Или отново с 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 } }
);