2014-05-18 220 views
0

我有一个分数集,如:我可以在聚合框架中获得组和计数吗?

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

我怎样才能获得各等级/组的最佳alumn?

等级: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}] 
+4

没有试图解决的问题。 –

+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 
     } 
    ] 
+0

即使他不是最好的,这也不会返回'{等级:1组:1,校友:2,得分:160}吗? –

+0

如果你检查OP的问题,他只总结了分数。根据他想要的结果 – mohamedrias

+0

如果你再读一遍,你会注意到他没有_just_ sum。第1组第2列和第2组第1列也被排除,因为他们在组中的总分不是最高的。 –

相关问题