按 MongoDB 中的两个字段聚合分组

Aggregation Grouping by Two Fields in MongoDB

我的架构如下:

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

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

我从未尝试过 MongoDB 聚合函数,所以我对如何着手做这件事有点困惑。我通读了 MongoDB 聚合文档,我最初的想法是进行两个分组和一个项目通过:

  1. 将每个事件分组为一天
  2. 将结果分组 eventType
  3. 对这些结果进行投影,以便输出采用适合图表的格式。

所以我的输出看起来像这样(所以我可以把它放在折线图上:

{
  [
    { 
        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"不告诉你其他的