我可以在聚合框架中获得组和计数吗?

时间:2014-05-18 04:38:08

标签: mongodb

我有一个得分集合:

{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}]

1 个答案:

答案 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
        }
    ]