Khung tổng hợp sẽ không tạo khóa dựa trên dữ liệu, cũng không nên bạn thậm chí đang làm như vậy vì "dữ liệu" không phải là khóa mà thực sự là dữ liệu, vì vậy bạn nên bám sát vào mẫu.
Điều đó có nghĩa là về cơ bản bạn chỉ có thể làm điều này:
db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])
Và điều đó sẽ tính số lần xuất hiện mỗi ngày trong tuần cho mỗi sự kiện, mặc dù trong nhiều tài liệu trong đầu ra, nhưng điều này dễ dàng thay đổi thành một tài liệu cho mỗi sự kiện:
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" } }
}}
])
Và đó là ở dạng mảng, nhưng nó vẫn giữ kết quả bạn muốn.
Nếu bạn thực sự muốn làm đúng biểu mẫu của mình thì bạn muốn làm điều gì đó như sau:
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
]
}
}
}}
)
Nhưng điều đó thực sự dài dòng nên IMHO, tôi sẽ gắn bó với giải pháp thứ nhất hoặc có thể là thứ hai vì chúng ngắn hơn và dễ đọc hơn.