まずソート
{ "$sort": [{"name": "targetValue", "direction": 1}] },
次にgroupして標準偏差、平均値、中央値を求める
{"$group": {
"_id": "$service",
"avg": {"$avg": "$targetValue"},
"targetValues": {"$push": "$targetValue"},
"stdDev": {"$stdDevPop": "$targetValue"},
"stdSamp": {"$stdDevSamp": "$targetValue"}
}},
第一四分位、第三四分位も求める
{"$project": {
"_id": 1,
"avg": 1,
"stdDev": 1,
"stdSamp": 1,
"median": {
"$arrayElemAt": ["$targetValues", {"$toInt": {
"$divide": [{"$size": "$targetValues"}, 2]
}}]
},
"1stQuarter": {
"$arrayElemAt": ["$targetValues", {"$toInt": {
"$divide": [{"$size": "$targetValues"}, 4]
}}]
},
"3rdQuarter": {
"$arrayElemAt": ["$targetValues",{"$toInt": {
"$multiply": [{"$divide": [{"$size": "$targetValues"}, 4]}, 3]
}}]
}
}
}
一つにして
[
{ "$sort": [{"name": "targetValue", "direction": 1}] },
{"$group": {
"_id": "$service",
"avg": {"$avg": "$targetValue"},
"targetValues": {"$push": "$targetValue"},
"stdDev": {"$stdDevPop": "$targetValue"},
"stdSamp": {"$stdDevSamp": "$targetValue"}
}},
{"$project": {
"_id": 1,
"avg": 1,
"stdDev": 1,
"stdSamp": 1,
"median": {
"$arrayElemAt": ["$targetValues", {"$toInt": {
"$divide": [{"$size": "$targetValues"}, 2]
}}]
},
"1stQuarter": {
"$arrayElemAt": ["$targetValues", {"$toInt": {
"$divide": [{"$size": "$targetValues"}, 4]
}}]
},
"3rdQuarter": {
"$arrayElemAt": ["$targetValues",{"$toInt": {
"$multiply": [{"$divide": [{"$size": "$targetValues"}, 4]}, 3]
}}]
}
}
}
]
注意点
mongoのバージョンはv4以上じゃないと$toInt
が使えないです。