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 }}}

何か案は?

4

1 に答える 1

2

次の形式の入力ドキュメントが与えられた場合:

> db.dates.findOne()
{ "_id" : 1, "item_id" : 1, "date" : "1/15/2012" }
> 

次の map および reduce 関数は、探している出力を生成する必要があります。

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の「Extras」セクションを参照してください。 /finding_max_and_min/

幸運を!

于 2012-04-02T19:48:48.683 に答える