1

コレクション内のオブジェクトに含まれる 3 つの異なるフィールドでグループ化するmap/reduce関数を実行しようとしています。mongodbmap/reduce 関数を実行することはできますが、出力されたすべてのフィールドが出力コレクションで一緒に実行されます。これが正常かどうかはわかりませんが、分析用のデータを出力するには、クリーンアップに多くの作業が必要です。それらを分離してから使用する方法はありますmongoexportか?

私が何を意味するかをお見せしましょう:

グループ化しようとしているフィールドは、日、ユーザー ID (または uid)、宛先です。

私はこれらの機能を実行します:

map = function() {
    day = (this.created_at.getFullYear() + "-" + (this.created_at.getMonth()+1) + "-" + this.created_at.getDate());
    emit({day: day, uid: this.uid, destination: this.destination}, {count:1});
}

/* Reduce Function */
reduce = function(key, values) { 
    var count = 0;
    values.forEach(function(v) {
        count += v['count'];
}
);
  return {count: count};
}

/* Output Function */
db.events.mapReduce(map, reduce, {query: {destination: {$ne:null}}, out: "TMP"});

出力は次のようになります。

{ "_id" : { "day" : "2012-4-9", "uid" : "1234456", "destination" : "Home" }, "value" : { "count" : 1 } }
{ "_id" : { "day" : "2012-4-9", "uid" : "2345678", "destination" : "Home" }, "value" : { "count" : 1 } }
{ "_id" : { "day" : "2012-4-9", "uid" : "3456789", "destination" : "Login" }, "value" : { "count" : 1 } }
{ "_id" : { "day" : "2012-4-9", "uid" : "4567890", "destination" : "Contact" }, "value" : { "count" : 1 } }
{ "_id" : { "day" : "2012-4-9", "uid" : "5678901", "destination" : "Help" }, "value" : { "count" : 1 } }

を使用しようとするとmongoexport、マップがフィールドを結合するため、日、uid、または目的地を列で区切ることができません。

私が望むものは次のようになります:

{ { "day" : "2012-4-9" }, { "uid" : "1234456" }, { "destination" : "Home"}, { "count" : 1 } }

これは可能ですか?

余談ですがsed、ファイルに適用してCSVをクリーンアップすることで、出力を機能させることができました。より多くの作業が行われましたが、うまくいきました。mongodb正しいフォーマットで 取り出せれば理想的です。

4

1 に答える 1

1

MapReduce はフォームのドキュメントのみを返します{_id:some_id, value:some_value}

参照: MongoDB の map-reduce の結果の構造を変更するには?

于 2012-07-05T12:02:51.277 に答える