コレクション内のオブジェクトに含まれる 3 つの異なるフィールドでグループ化するmap/reduce
関数を実行しようとしています。mongodb
map/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
正しいフォーマットで 取り出せれば理想的です。