.find()
no "altera" los documentos devueltos de ninguna manera. Solo puede "incluir" o "excluir" en la proyección.
Las únicas cosas que "alteran" son .aggregate()
o .mapReduce()
.
Para .aggregate()
, requiere MongoDB 3.4 para $strLenCP
o $strLenBytes
, pero por lo general te refieres a lo primero:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Para .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Y, de manera realista, en el último caso, también puede estar iterando el cursor, y es posible que lo necesite, a menos que la colección sea lo suficientemente pequeña o que pueda generar otra colección en su lugar.
El $size
El operador que está intentando usar solo se aplica a "matrices" para devolver el número de entradas presentes. Y nuevamente, solo es válido para usar con .aggregate()
método.
Si quiere omitir caracteres como un space
dentro de una cadena, entonces un $split
y $reduce
con $concat
se puede aplicar:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
O de nuevo con 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 } }
);