MongoDB中两个字段的聚合分组

时间:2015-08-13 16:43:45

标签: mongodb aggregation-framework

我有以下架构:

Event : {
    eventType : Number,
    created : Date,
}

我的最终目标是为每个eventType创建一个折线图,显示每天发布的每个事件的数量。

我从来没有尝试过MongoDB聚合函数,所以我对如何做到这一点感到有些困惑。我阅读了MongoDB聚合文档,我最初的想法是做两个分组和一个项目传递:

  1. 将每个活动分组为一天
  2. eventType
  3. 对结果进行分组
  4. 投影这些结果,以便输出图形格式良好。
  5. 所以我的输出看起来像这样(所以我可以把它放在线图上:

    {
      [
        { 
            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 ] 
        }, {        
        ...
      ]
    }
    

    我不确定在概念上是否正确,而且我对这需要的语法更不确定。任何帮助将不胜感激!

1 个答案:

答案 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输出请求,但只要您配置它,该软件包实际上也支持标准对象列表。只是所有“基本例子”都没有告诉你。