.find()
返されたドキュメントを「変更」することはありません。投影に「含める」または「除外する」ことしかできません。
「変更」するのは、 .aggregate()
または.mapReduce()
。
.aggregate()
の場合 、 $strLenCP
にはMongoDB3.4が必要です
または$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 } }
);