2013-05-28 89 views
1

我有以下記錄的查找結果:MongoDB的GROUP BY鍵

[{ 'programming': 7 }, 
{ 'programming': 9 }, 
{ 'programming': 6 }, 
{ 'programming': 10 }, 
{ 'music': 1 }, 
{ 'music': 2 }, 
{ 'music': 3 }, 
{ 'music': 4 }] 

我想他們GROUP BY鍵和總結的價值,有:

[{'programming': 32}, 
{'music': 10}] 

排序他們(在這種情況下,首先編程,然後是音樂)並且限制爲3(如果存在programming 32music 10,shopping 3lifestyle 1,僅返回programming,shoppinglifestyle,

如何彙總這些數據?我應該使用mapreduce,聚合還是簡單的分組?如果是這樣,如何通過字典鍵告訴羣組分組?

謝謝

回答

1

這樣做的關鍵會殺死您的查詢可維護性。

我最好的建議是:創建另一個鍵,例如skill(它將成爲文檔分組鍵)和一個名爲value的鍵。
然後你會得到一個查詢有點像這樣:

db.skills.aggregate([{ 
    $group: { 
    _id: "$skill", 
    value: { $sum: "$value" } 
    } 
}]) 
1

雖然我建議,你可以使用MapReduce的它會@ gustavohenke的路線有沒有密鑰分組(我想不出的採用聚合的方式,這將是更直接的路線)

> var mapFunction = function() { 
    for(var key in this) { 
     if(key!='_id') emit(key, this[key]); 
    } 
    }; 

> var reduceFunction = function(key, values) { return Array.sum(values); } 

> db.data.mapReduce(mapFunction, reduceFunction, { out: 'bop' }) 
{ 
    "result" : "bop", 
    "timeMillis" : 47, 
    "counts" : { 
     "input" : 8, 
     "emit" : 8, 
     "reduce" : 2, 
     "output" : 2 
    }, 
    "ok" : 1, 
} 
> db.bop.find().sort({value: -1}).limit(3) 
{ "_id" : "programming", "value" : 32 } 
{ "_id" : "music", "value" : 10 } 
>