Struktura agregacji nie tworzy kluczy na podstawie danych, ani powinna robisz to nawet, ponieważ „dane” nie są kluczem, ale faktycznie danymi, więc powinieneś trzymać się wzorca.
Oznacza to, że możesz po prostu zrobić to:
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])
A to zliczy wystąpienia na dzień tygodnia na zdarzenie, aczkolwiek w wielu dokumentach w wyniku, ale można to łatwo zmienić na jeden dokument na zdarzenie:
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" } }
}}
])
I to jest w formie tablicy, ale nadal zawiera żądane wyniki.
Jeśli naprawdę chcesz wykonać dokładny formularz, chcesz zrobić coś takiego:
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
]
}
}
}}
)
Ale to jest naprawdę długie, więc IMHO trzymałbym się pierwszego, a może drugiego rozwiązania, ponieważ są one krótsze i łatwiejsze do odczytania.