【发布时间】:2014-08-08 10:15:53
【问题描述】:
我有以下文档结构
{
"app_id": "DHJFK67JDSJjdasj909",
"date": ISODate("2014-08-07T00:00:00.000Z"),
"event_count": 100,
"events": [
{ "type": 0, "value": 12 },
{ "type": 10, "value": 24 },
{ "type": 20, "value": 36 },
{ "type": 30, "value": 43 }
],
"unique_events": [
{ "type": 0, "value": 5 },
{ "type": 10, "value": 8 },
{ "type": 20, "value": 12 },
{ "type": 30, "value": 56 }
]
}
我正在尝试获取 event_counts 的总和以及每个类型的 unique_events 和事件的值。这是我期望的输出类型,其中 event_count 以及每个事件和 unique_events 值已按类型求和。
{
"app_id": "DHJFK67JDSJjdasj909",
"date": ISODate("2014-08-07T00:00:00.000Z"),
"event_count": 4345,
"events": [
{ "type": 0, "value": 624 },
{ "type": 10, "value": 234 },
{ "type": 20, "value": 353 },
{ "type": 30, "value": 472 }
],
"unique_events": [
{ "type": 0, "value": 433 },
{ "type": 10, "value": 554 },
{ "type": 20, "value": 645 },
{ "type": 30, "value": 732 }
]
}
这是我的查询
db.events.aggregate([
{ "$unwind": "$events" },
{ "$group": {
"_id": {
"app_id": "$app_id",
"type": "$events.type"
"unique_type": "$unique_events.type"
},
"event_count": { "$sum": "$event_count" },
"event_value": { "$sum": "$events.value" },
"unique_event_value": { "$sum": "$unique_events.value" }
}},
{ "$group": {
"_id": "$_id.app_id",
"event_count": { "$sum": "$event_count" },
"events": { "$push": { "type": "$_id.type", "value": "$event_value" } }
"unique_events": { "$push": { "type": "$_id.unique_type", "value": "$unique_event_value" } }
}}
])
问题在于,使用两个 $unwinds 然后按事件和 unique_events 进行分组会导致 $sum 复合且太大。有什么方法可以使用 mongo 解决这个问题,还是我必须运行两个查询,然后在代码中合并两个结果集。
谢谢
伊尔凡
【问题讨论】:
-
这是您的实际聚合吗?你这里只有一个 $unwind。
-
事件和唯一事件数组的大小是否始终相同?
-
@AsyaKamsky 我认为这并不重要。除了着眼于整体问题,解决方案是相当不言而喻的。但是考虑重新建模数据应该始终是一种选择。特别是当一般查询想要“组合”文档中的多个数组时。
-
@NeilLunn 实际上很重要 - 如果唯一代表事件的聚合(通过唯一的任何东西),那么它可以显着地简化管道
标签: mongodb mongodb-query aggregation-framework