.find()
não "altera" os documentos devolvidos de forma alguma. Você só pode "incluir" ou "excluir" na projeção. As únicas coisas que "alteram" são
.aggregate()
ou .mapReduce()
. Para
.aggregate()
, requer MongoDB 3.4 para $strLenCP
ou $strLenBytes
, mas geralmente você quer dizer o primeiro:db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Para
.mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
E, realisticamente, no último caso, você também pode estar iterando o cursor e pode precisar, a menos que a coleção seja pequena o suficiente ou você possa realmente enviar para outra coleção.
O
$size
operador que você está tentando usar só se aplica a "matrizes" para retornar o número de entradas presentes. E, novamente, só é válido para uso com o .aggregate()
método. Se você pretende omitir caracteres como um
space
dentro de uma string então um $split
e $reduce
com $concat
pode ser aplicado:db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Ou novamente com
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 } }
);