.find()
non "altera" in alcun modo i documenti restituiti. Puoi solo "includere" o "escludere" nella proiezione.
Le uniche cose che "alterano" sono .aggregate()
o .mapReduce()
.
Per .aggregate()
, richiede MongoDB 3.4 per $strLenCP
o $strLenBytes
, ma di solito intendi il primo:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Per .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
E realisticamente in quest'ultimo caso, potresti anche iterare il cursore e potrebbe essere necessario a meno che la raccolta non sia sufficientemente piccola o tu possa effettivamente eseguire l'output su un'altra raccolta.
Il $size
l'operatore che stai tentando di utilizzare si applica solo agli "array" per restituire il numero di voci presenti. E ancora, è valido solo per l'utilizzo con .aggregate()
metodo.
Se intendi omettere caratteri come uno space
all'interno di una stringa quindi un $split
e $reduce
con $concat
può essere applicato:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
O ancora 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 } }
);