【发布时间】:2020-06-01 08:29:29
【问题描述】:
我有一个包含训练 (T) 的集合,其中包含一个练习数组,我想找到使值最大/最小长度最大化并计算平均值的嵌套组。集合如:
[{
"_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 阶段,它解构了练习和分组训练丢失了。但我不确定如何更改它。
【问题讨论】:
-
嗯,你确定你的预期结果吗?最少 10 个,最多 15 个,平均 10 个???
-
我想是的。为什么?你有没有发现什么奇怪的东西?这个想法是计算所有训练的每个目标的最小值、最大值和平均值,并最大化结果。
-
[{ _id: "aaa" min: 5, max: 15, avg: 10 },{ _id: "bbb", min: 5, max: 5, avg: 5 },{ _id :“ccc”,最小:5,最大:10,平均:7.5 }]
-
@mattPen 你是对的。我只关注aaa。我刚刚纠正了它。谢谢。
-
好的,更好理解。您的目标数组中可以有多个值,即目标:[“aaa”,“ccc”]?
标签: mongodb aggregation-framework