次のようなドキュメントがあります。
{
"_id" : "someuniqueeventid",
"event" : "event_type_1",
"date" : ISODate("2014-01-14T00:00:00Z"),
}
「event
」でグループ化し、曜日ごとに発生した各イベントタイプの数をカウントします。基本的に、私は次のようなものを手に入れたいです:
{
"_id": "event_type_1",
"1": "number of event_type_1 for Monday",
"2": "number of event_type_1 for Tuesday",
...
},
{
"_id": "event_type_2",
...
}
残念ながら、私は立ち往生しています:
db.data.aggregate([ {$project: {date_of_week: {$dayOfWeek: "$date"}, event: "$event"}},
{$group: {_id: "$event", .... } ])
何か案は?
集計フレームワークは、データに基づいてキーを作成しません。shouldでも、「データ」はキーではなく実際のデータなので、パターンに固執する必要があります。
つまり、基本的にこれを行うことができます:
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
]
}
}
}}
)
しかし、それは非常に長い時間がかかるので、IMHOは最初のソリューションまたはおそらく2番目のソリューションを使用します。
MongoDb 3.4.4以降では、$arrayToObject
演算子を使用してカウントを取得します。次の集約パイプラインを実行する必要があります。
db.data.aggregate([
{
"$group": {
"_id": {
"event": "$event",
"day": { "$substr": [ { "$dayOfWeek": "$date" }, 0, -1 ] }
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.event",
"counts": {
"$Push": {
"k": "$_id.day",
"v": "$count"
}
}
}
},
{
"$project": {
"counts": { "$arrayToObject": "$counts" }
}
}
])