我有一个得分集合:
{grade:1 group:1, alumn:1, score:100},
{grade:1 group:1, alumn:1, score:100},
{grade:1 group:1, alumn:2, score:80},
{grade:1 group:1, alumn:2, score:80},
{grade:1 group:2, alumn:1, score:70},
{grade:1 group:2, alumn:1, score:70},
{grade:1 group:2, alumn:2, score:80},
{grade:1 group:2, alumn:2, score:80},
{grade:1 group:3, alumn:1, score:90},
{grade:1 group:3, alumn:1, score:90},
{grade:1 group:3, alumn:2, score:90},
{grade:1 group:3, alumn:2, score:90},
如何获得每个年级/小组的最佳成绩?
等级:1
[{group:1, alumn:1, score:200}],
[{group:2, alumn:2, score:160}],
[{group:3, alumn:1, score:180},
{group:3, alumn:2, score:180}]
答案 0 :(得分:1)
此查询将返回您所需的输出:
var scores = db.scores.aggregate({
$group: {
_id: {
grade: "$grade",
group: "$group",
alumn: "$alumn"
},
score: {
$sum: "$score"
}
}
}, {
$project: {
_id: 0,
group: "$_id.group",
alumn: "$_id.alumn",
score: "$score"
}
}, {
$sort: {
group: 1,
score: -1
}
});
我们不能直接单独获取第一个文档,所以我写了一些JS来做这个部分:
从第一个查询中,我们将得到:
{
"result" : [
{
"score" : 200,
"group" : 1,
"alumn" : 1
},
{
"score" : 160,
"group" : 1,
"alumn" : 2
},
{
"score" : 160,
"group" : 2,
"alumn" : 2
},
{
"score" : 140,
"group" : 2,
"alumn" : 1
},
{
"score" : 180,
"group" : 3,
"alumn" : 2
},
{
"score" : 180,
"group" : 3,
"alumn" : 1
}
],
"ok" : 1
}
现在是过滤部分,
function duplicate(array,index, value) {
var matched = false;
for(var i=0; i<array.length; i++) {
if(i<index) {
if(value==array[i].group) {
return false;
}
} else {
return true;
}
}
}
现在只需致电
scores.result.filter(function(e,index) {return duplicate(scores.result,index,e.group)});
这会给你
[
{
"score" : 200,
"group" : 1,
"alumn" : 1
},
{
"score" : 160,
"group" : 2,
"alumn" : 2
},
{
"score" : 180,
"group" : 3,
"alumn" : 2
}
]