2013-05-28 6 views
1

У меня есть следующие записи в результате находки:группы MongoDB ключома

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

Я хочу сгруппировать их с помощью ключа и просуммировать значения, чтобы иметь:

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

сортировать их по значению (в данном случае, первое программирование, а затем музыка) и предел по 3 (если есть programming 32, music 10, shopping 3 и lifestyle 1, возвращать только programming, shopping и lifestyle.

Как собрать такие данные? Должен ли я использовать mapreduce, aggregate или просто группу? Если да, то как сообщить группе о группе ключом словаря?

Благодаря

ответ

1

Doing что ключи будут убить ремонтопригодность запроса.

Мой лучший совет: создать еще один ключ, скажем skill (который будет ключом для группировки документов) и клавишей value.
Тогда вы получите запрос примерно так:

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

Хотя я рекомендую идти @ маршрут gustavohenke с не группировать с помощью клавиш, вы можете сделать это с помощью MapReduce (я не могу думать о способ сделать это с использованием скоплений, которые были бы более прямым направлением)

> 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 } 
> 
Смежные вопросы