У меня есть коллекция с тренировками (T), которая содержит массив упражнений, и я хотел бы найти вложенную группу, которая максимизирует значения max / min длины и вычислить среднее. Коллекция такая:
[{
"_id" : ObjectId("5e456e6b33fef4299aa75a7e"),
"title" : "Training aaa and bbb",
"exercises" : [{
"title" : "aaa exercise",
"goals" : ["aaa"],
"length" : 10
},{
"title" : "bbb exercise",
"goals" : ["bbb"],
"length" : 5
}],
"createdBy" : "dummy"
},{
"_id" : ObjectId("5e456e7f33fef4299aa75a7f"),
"title" : "Training aaa, ccc",
"exercises" : [{
"title" : "aaa exercise",
"goals" : ["aaa"],
"length" : 5
},{
"title" : "aaa exercise",
"goals" : ["aaa"],
"length" : 10
},{
"title" : "ccc exercise",
"goals" : ["ccc"],
"length" : 5
}],
"createdBy" : "dummy"
},{
"_id" : ObjectId("5e49b282e0a271e9f57648ff"),
"title" : "Training aaa 2",
"exercises" : [{
"title" : "aaa",
"goals" : ["aaa"],
"length" : 5
},{
"title" : "ccc exercise",
"goals" : ["ccc"],
"length" : 10
}],
"createdBy" : "dummy"
}]
Я бы хотел найти минимальное / максимальное / среднее по цели и тренировке. С предыдущими значениями ожидаемые значения должны соответствовать:
[{
_id: "aaa"
min: 5, // T1: 5
max: 15, // T2: 5 + 10
avg: 10 // T1,T2,T3: (10+15+5)/3 = 10
},{
_id: "bbb",
min: 5, // T1: 5
max: 5, // T1: 5
avg: 5 // T1: 5/1 = 5
},{
_id: "ccc",
min: 5, // T2: 5
max: 10, // T3: 10
avg: 5 // T2,T3: (5+10)/2 = 7,5
}]
В этом примере aaa тренировался 10 минут в первой тренировке, 15 во второй и 5 в третьей. Поэтому min = 5, max = 15, avg: (10 + 15 + 5) / 3 = 10
Я попробовал следующее, но я не получил ожидаемый результат, хотя он близок:
db.getCollection('trainings').aggregate([
{$match : {"createdBy" : "dummy" } },
{$unwind: "$exercises"},
{$unwind: "$exercises.goals" },
{$group: {
_id: "$exercises.goals",
count: { $sum: 1 },
lengthAvg: {$avg: "$exercises.length"},
lengthMin: {$min: "$exercises.length"},
lengthMax: {$max: "$exercises.length"},
lengthSum: {$sum: "$exercises.length"}
}
}
])
Я думаю, что проблема связана со стадией $ unwind, которая разбирает упражнения, а группа по тренировке теряется. Но я не уверен, как это изменить.