我有以下架构:
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 ]
}, {
...
]
}
我不确定在概念上是否正确,而且我对这需要的语法更不确定。任何帮助将不胜感激!
答案 0 :(得分:1)
是的,这里的基本想法是分组两次,你也想要使用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" }
}}
])
或者您可以使用日期数学来返回时间戳值:
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"
}
}
}}
])
每个数组索引已包含所有信息。
当您真正查看有关支持的数据结构的文档时,大多数图形包都非常灵活。对于“流行软件包”,以特定方式(全部在数组中)格式化数据是一种常见的MongoDB输出请求,但只要您配置它,该软件包实际上也支持标准对象列表。只是所有“基本例子”都没有告诉你。