MongoDB与PHP聚合 - 按日期分组

时间:2013-01-05 01:47:37

标签: php mongodb aggregation-framework

我在aggregate MongoDB使用了PHP。代码如下:

$results = $c->aggregate(array(
    array(
      '$project' => array(
          'day' => array('$dayOfYear' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('day' => '$day'),
          'count' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id' => 1
      ),
    ),
    array(
      '$limit' => 30
    )
));

这个问题是,$dayOfYear没有正确排序,因为它排序2然后是3然后345,346 ......我需要它来提升日期。所以,基本上不是简单地做$dayOfYear我需要像$year-$month-$dayOfMonth这样的东西。

不幸的是,这不起作用。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以将这些部分投影出来,然后对它们进行分组,以便您对整个日期进行分组:

$results = $c->aggregate(array(
    array(
      '$project' => array(
          'year' => array('$year' => '$executed' ),
          'month' => array('$month' => '$executed' ),
          'day' => array('$dayOfMonth' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
          'count' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id.year' => 1,
          '_id.month' => 1,
          '_id.day' => 1
      ),
    ),
    array(
      '$limit' => 30
    )
));

这样的事情可以让你按照你所说的那样排序:$year-$month-$dayOfMonth

答案 1 :(得分:0)

您不应该对整个_id进行排序,因为您已将其设置为包含一个对象(可以奇怪地排序),因此请将$sort更改为此而不是按日排序年份:

  '$sort' => array(
      '_id.day' => 1
  ),