各キーの最大値まで減少させるために、このために使用.mapReduce()
:
基本的に減少」で、各文書のサブ文書のパス内の各キー本の
"length"
を発し、
db.collection.mapReduce(
function() {
emit(null,
Object.keys(this.someotherdata).map(k => ({ [k]: this.someotherdata[k].length }))
.reduce((acc,curr) => Object.assign(acc,curr),{})
);
},
function(key,values) {
var result = {};
values.forEach(value => {
Object.keys(value).forEach(k => {
if (!result.hasOwnProperty(k))
result[k] = 0;
if (value[k] > result[k])
result[k] = value[k];
});
});
return result;
},
{
"out": { "inline": 1 },
"query": { "someotherdata": { "$exists": true } }
}
)
"、各キーの最大の"length"
のみが実際に返されます。
mapReduce
では、多数のドキュメントを処理する方法が段階的なバッチで「削減」されるため、同じ構造を配置する必要があることに注意してください。だから私たちはemit
の数値形式で、"reduce"
のように機能します。
この出力は、質問に示されているドキュメントに表示されます。もちろん、それがコレクションのすべてのドキュメントの "最大値"です。興味のために
{
"_id" : null,
"value" : {
"place1" : 25.0,
"place2" : 26.0,
"place3" : 13.0,
"place4" : 38.0
}
}
、質問の内容は、MongoDBの3.4の特徴は、それらに利用できなかったという事実です。同じ出力で
db.collection.aggregate([
{ "$match": { "someotherdata": { "$exists": true } } },
{ "$project": {
"_id": 0,
"someotherdata": {
"$map": {
"input": { "$objectToArray": "$someotherdata" },
"as": "s",
"in": { "k": "$$s.k", "v": { "$strLenCP": "$$s.v" } }
}
}
}},
{ "$unwind": "$someotherdata" },
{ "$group": {
"_id": "$someotherdata.k",
"v": { "$max": "$someotherdata.v" }
}},
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"data": {
"$push": { "k": "$_id", "v": "$v" }
}
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
:
{
"place1" : 25,
"place2" : 26,
"place3" : 13,
"place4" : 38
}
で値を出力する '$ strLenBytes'または' $ strLenCP'にアクセスしないと、 'mapReduce'を使用してJavaScript関数を使って各プロパティの長さを返す必要があります。コレクション全体を通して「各キーの最長の長さ」、または「ドキュメントごとの各キーの長さ」だけを要求しているのか、それとも実際に出力が必要なのかは分かりません。たとえば、4つのキーがあり、3の出力のみのドキュメントを表示します。 –
@NeilLunn私の回答を編集しました – 32423hjh32423