2014-05-18 219 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列也被排除,因爲他們在組中的總分不是最高的。 –

相關問題