Kerangka kerja agregasi tidak akan membuat kunci berdasarkan data, atau seharusnya Anda bahkan melakukannya karena "data" bukanlah kunci tetapi sebenarnya data, jadi Anda harus tetap berpegang pada polanya.
Itu berarti pada dasarnya Anda dapat melakukan ini:
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])
Dan itu akan menghitung kemunculan per hari dalam seminggu per peristiwa, meskipun dalam beberapa dokumen di output, tetapi ini mudah diubah menjadi satu dokumen per peristiwa:
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" } }
}}
])
Dan itu dalam bentuk array, tetapi masih menyimpan hasil yang Anda inginkan.
Jika Anda benar-benar bertekad untuk melakukan bentuk yang tepat, maka Anda ingin melakukan sesuatu seperti ini:
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
]
}
}
}}
)
Tapi itu benar-benar bertele-tele jadi IMHO saya akan tetap dengan solusi pertama atau mungkin kedua karena lebih pendek dan lebih mudah dibaca.