按 MongoDB 中的两个字段聚合分组
Aggregation Grouping by Two Fields in MongoDB
我的架构如下:
Event : {
eventType : Number,
created : Date,
}
我的最终目标是为每个 eventType
创建一个折线图,显示每天发布的每个事件的数量。
我从未尝试过 MongoDB 聚合函数,所以我对如何着手做这件事有点困惑。我通读了 MongoDB 聚合文档,我最初的想法是进行两个分组和一个项目通过:
- 将每个事件分组为一天
- 将结果分组
eventType
- 对这些结果进行投影,以便输出采用适合图表的格式。
所以我的输出看起来像这样(所以我可以把它放在折线图上:
{
[
{
eventType: 0,
days : [ ISODate(2015-01-01), ISODate(2015-01-02), ISODate(2015-01-03) ],
totals: [ 0, 15, 3 ]
}, {
eventType: 1,
days : [ ISODate(2015-01-01), ISODate(2015-01-02), ISODate(2015-01-03) ],
totals: [ 4, 5, 2 ]
}, {
...
]
}
我不确定这在概念上是否正确,我更不确定这需要的语法。如有任何帮助,我们将不胜感激!
是的,这里的基本思想是分组两次,您还想利用 date aggregation operators:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"year": { "$year": "$created" },
"month": { "$month": "$created" },
"day": { "$dayOfMonth": "$created" }
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": { "$push": "$_id.date" },
"totals": { "$push": "$total" }
}}
])
或者您可以使用日期数学来 return 时间戳值:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"$subtract": [
{ "$subtract": [ "$created", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$created", new Date(0) ] },
]}
]
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": { "$push": "$_id.date" },
"totals": { "$push": "$total" }
}}
])
就我个人而言,两个数组的可读性似乎不如一个。所以我更喜欢这个:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"$subtract": [
{ "$subtract": [ "$created", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$created", new Date(0) ] },
]}
]
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": {
"$push": {
"date": "$_id.date", "total": "$total"
}
}
}}
])
其中每个数组索引已包含所有信息。
当您真正查看有关支持的数据结构的文档时,大多数图形包确实非常灵活。对于 "popular package",以特定方式(全部在数组中)格式化数据是一个常见的 MongoDB 输出请求,但只要您也对其进行配置,该包实际上确实支持标准对象列表。只是大家"basic examples"不告诉你其他的
我的架构如下:
Event : {
eventType : Number,
created : Date,
}
我的最终目标是为每个 eventType
创建一个折线图,显示每天发布的每个事件的数量。
我从未尝试过 MongoDB 聚合函数,所以我对如何着手做这件事有点困惑。我通读了 MongoDB 聚合文档,我最初的想法是进行两个分组和一个项目通过:
- 将每个事件分组为一天
- 将结果分组
eventType
- 对这些结果进行投影,以便输出采用适合图表的格式。
所以我的输出看起来像这样(所以我可以把它放在折线图上:
{
[
{
eventType: 0,
days : [ ISODate(2015-01-01), ISODate(2015-01-02), ISODate(2015-01-03) ],
totals: [ 0, 15, 3 ]
}, {
eventType: 1,
days : [ ISODate(2015-01-01), ISODate(2015-01-02), ISODate(2015-01-03) ],
totals: [ 4, 5, 2 ]
}, {
...
]
}
我不确定这在概念上是否正确,我更不确定这需要的语法。如有任何帮助,我们将不胜感激!
是的,这里的基本思想是分组两次,您还想利用 date aggregation operators:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"year": { "$year": "$created" },
"month": { "$month": "$created" },
"day": { "$dayOfMonth": "$created" }
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": { "$push": "$_id.date" },
"totals": { "$push": "$total" }
}}
])
或者您可以使用日期数学来 return 时间戳值:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"$subtract": [
{ "$subtract": [ "$created", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$created", new Date(0) ] },
]}
]
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": { "$push": "$_id.date" },
"totals": { "$push": "$total" }
}}
])
就我个人而言,两个数组的可读性似乎不如一个。所以我更喜欢这个:
db.event.aggregate([
{ "$group": {
"_id": {
"eventType":"$eventType",
"date": {
"$subtract": [
{ "$subtract": [ "$created", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$created", new Date(0) ] },
]}
]
}
},
"total": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.eventType",
"days": {
"$push": {
"date": "$_id.date", "total": "$total"
}
}
}}
])
其中每个数组索引已包含所有信息。
当您真正查看有关支持的数据结构的文档时,大多数图形包确实非常灵活。对于 "popular package",以特定方式(全部在数组中)格式化数据是一个常见的 MongoDB 输出请求,但只要您也对其进行配置,该包实际上确实支持标准对象列表。只是大家"basic examples"不告诉你其他的