4
我有一些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 }}}
任何想法?
Marc,謝謝你的幫助。在此之後,我在排序日期有一些問題。我想要如:{「_id」:1,「value」:{「item_id」:1,「date」:{「2012年1月1日」:3,「1/15/2012」:2}}} 。我在db.runCommand({「mapReduce」:「dates」,map:map,reduce:reduce,sort:{date:1},out:{replace:「dates_output」}}中添加了排序:{date:1} 。但在此操作後,我有:{「_id」:1,「value」:{「item_id」:1,「date」:{「2012年1月1日」:1,「1/15/2012」:1} }}日期是排序,但始終是1 – 2012-04-03 14:51:32
你好。我很高興能夠提供幫助! 「value」中的嵌入元素將按照它們發現的順序添加。對日期鍵上的輸入排序會在嵌入式文檔中按順序排列日期。但是,在此示例中,日期是字符串,並且不能保證日期較晚的字符串的值比早期值的字符串的值大。例如(在js shell中): >「10/01/2012」<「1/01/2013」 false 字符串必須先轉換爲日期才能正確比較。 – Marc 2012-04-04 16:12:02
一旦你照顧到了這一點,你應該能夠按照你所希望的順序得到結果: > db.runCommand({「mapReduce」:「日期」,map:map,reduce:reduce,sort:{ 「date」:1},out:{replace:「dates_output」}}) 如果您收到類似於「exception:could not create cursor over test.dates for query」的錯誤,請嘗試將索引添加到「date」鍵入輸入集合。 – Marc 2012-04-04 16:12:36