集計フレームワークは、データに基づいてキーを作成することはなく、すべきではありません 「データ」はキーではなく実際にはデータであるため、そうしているので、パターンに固執する必要があります。
つまり、基本的にこれを行うことができます:
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])
これにより、出力に複数のドキュメントが含まれていても、イベントごとに曜日ごとの発生がカウントされますが、これはイベントごとに1つのドキュメントに簡単に変更できます。
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.event_type",
"days": { "$push": { "day": "$_id.day", "count": "$count" } }
}}
])
そしてそれは配列形式ですが、それでもあなたが望む結果を保持します。
あなたが本当にあなたの正確な形をすることに熱心であるならば、あなたはこのような何かをしたいと思うでしょう:
db.data.aggregate([
{ "$group": {
"_id": "$event",
"1": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
1,
0
]
}
},
"2": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
1,
0
]
}
},
"3": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
1,
0
]
}
},
"4": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
1,
0
]
}
},
"5": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
1,
0
]
}
},
"6": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
1,
0
]
}
},
"7": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
1,
0
]
}
}
}}
)
しかし、それは非常に時間がかかるので、私は最初の解決策、またはおそらく2番目の解決策に固執します。それらは短く、読みやすいからです。