Как отобразить-уменьшить группу, отсортировать и посчитать значения сортировки
У меня есть некоторые проблемы с mapreduce
,
Я хочу сгруппировать, отсортировать и посчитать некоторые значения в коллекции. У меня есть коллекция, такая как:
----------------------------
| item_id | date |
----------------------------
| 1 | 01/15/2012 |
----------------------------
| 2 | 01/01/2012 |
----------------------------
| 1 | 01/15/2012 |
----------------------------
| 1 | 01/01/2012 |
----------------------------
| 2 | 01/03/2012 |
----------------------------
| 2 | 01/03/2012 |
----------------------------
| 1 | 01/01/2012 |
----------------------------
| 1 | 01/01/2012 |
----------------------------
| 2 | 01/01/2012 |
----------------------------
| 2 | 01/01/2012 |
----------------------------
Я хочу сгруппировать по item_id
и посчитать дату за днем для каждого элемента и сортировать дату для каждого элемента и получить такой результат, как:
value: {{item_id:1, date:{01/01/2012:3, 01/15/2012:2 }},{item_id:2, date:{01/01/2012:3, 01/03/2012:2 }}}
я использую mapReduce
:
m=function()
{
emit(this.item_id, this.date);
}
r=function(key, values)
{
var res={};
values.forEach(function(v)
{
if(typeof res[v]!='undefined') ? res[v]+=1 : res[v]=1;
});
return res;
}
Но я не получил такой результат, как:
{{item_id:1, date:{01/01/2012:3, 01/15/2012:2 }},{item_id:2, date:{01/01/2012:3, 01/03/2012:2 }}}
Есть идеи?
1 ответ
Даны входные документы вида:
> db.dates.findOne()
{ "_id" : 1, "item_id" : 1, "date" : "1/15/2012" }
>
Следующая функция преобразования и сокращения должна выдавать искомый результат:
var map = function(){
myDate = this.date;
var value = {"item_id":this.item_id, "date":{}};
value.date[myDate] = 1;
emit(this.item_id, value);
}
var reduce = function(key, values){
output = {"item_id":key, "date":{}};
for(v in values){
for(thisDate in values[v].date){
if(output.date[thisDate] == null){
output.date[thisDate] = 1;
}else{
output.date[thisDate] += values[v].date[thisDate];
}
}
}
return output;
}
> db.runCommand({"mapReduce":"dates", map:map, reduce:reduce, out:{replace:"dates_output"}})
> db.dates_output.find()
{ "_id" : 1, "value" : { "item_id" : 1, "date" : { "1/15/2012" : 2, "1/01/2012" : 3 } } }
{ "_id" : 2, "value" : { "item_id" : 2, "date" : { "1/01/2012" : 3, "1/03/2012" : 2 } } }
Надеюсь, что вышеперечисленное сделает то, что вам нужно, или, по крайней мере, направит вас в правильном направлении.
Для получения дополнительной информации об использовании Map Reduce с MongoDB см. Документацию Mongo: http://www.mongodb.org/display/DOCS/MapReduce
В Поваренной книге MongoDB есть несколько дополнительных примеров Map Reduce: http://cookbook.mongodb.org/
Пошаговое руководство по выполнению операции Map Reduce см. В разделе "Дополнительно" рецепта поваренной книги MongoDB "Поиск максимальных и минимальных значений с версионными документами" http://cookbook.mongodb.org/patterns/finding_max_and_min/
Удачи!