mongodb聚合管道中的多个组

时间:2016-09-20 19:39:19

标签: mongodb mongodb-aggregation

我有一个包含以下数据的集合:

{
  attribute: 'value',
  date: ISODate("2016-09-20T18:51:05Z")
}

我希望按attribute分组以获取每个属性的总计数,同时按attribute$hour分组,以获得每个属性和小时的计数。

我知道我可以这样做:

{
  $group: {
    _id: '$attribute'
    count: {
      $sum: 1
    }
  }
}

{
  $group: {
    _id: {
      attribute : '$attribute',
      hour: {
        '$hour' : '$date'
      }
    },
    count: {
      $sum: 1
    }
  }
},
{
  $group: {
    _id: {
      attribute: '$_id.attribute'
    },
    hours: {
      '$push': {
        hour: '$_id.hour',
        count: '$count'
      }
    }
  }
}

将两个结果分别用于两个单独的聚合,但有没有办法在一个查询中获得我想要的结果?

按要求编辑:

也许这是完全错误但理想情况下我希望得到如下回复:

{
  _id: "attribute1",
  total: 20, // Total number of attribute1 documents

  // And the breakdown of those 20 documents per hour
  hours: [{
    hour: 10,
    count: 8
  },
  {
    hour: 14,
    count: 12
  }]
}

然而,问题的关键在于是否可以在mongodb中的一个查询中完成(以及如何)。不在两个将在应用程序层上合并的查询

1 个答案:

答案 0 :(得分:1)

您可以先按属性 - 小时对及其相应的事件进行分组 然后,您投影属性,一对小时计数和该计数的副本 最后,您只按属性分组,$push对,并计算总和。

[
    {
        $group: {
            _id: {
                attribute: "$attribute",
                hour: { "$hour": "$date" }
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $project: {
            attribute: "$_id.attribute",
            pair: { hour: "$_id.hour", count: "$count" },
            count: "$count",
            _id: 0
        }
    },
    {
        $group: {
            _id: "$attribute",
            hours: {
                $push: "$pair"
            },
            total: {
                $sum: "$count"
            }
        }
    }
]