Aggregeringsrammen vil ikke skabe nøgler baseret på data, og det skal heller ikke du gør det endda, da "data" ikke er en nøgle, men faktisk data, så du bør holde dig til mønsteret.
Det betyder, at du stort set bare kan gøre dette:
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])
Og det vil tælle forekomsterne pr. ugedag pr. begivenhed, dog i flere dokumenter i outputtet, men det er nemt at ændre til et enkelt dokument pr. begivenhed:
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" } }
}}
])
Og det er i en matrixform, men det holder stadig de resultater, du ønsker.
Hvis du virkelig er indstillet på at lave din nøjagtige form, vil du gerne gøre noget som dette:
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
]
}
}
}}
)
Men det er virkelig langtrukkent, så IMHO ville jeg holde mig til den første eller måske anden løsning, da de er kortere og nemmere at læse.