Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB与PHP聚合-按日期分组_Php_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB与PHP聚合-按日期分组

MongoDB与PHP聚合-按日期分组,php,mongodb,aggregation-framework,Php,Mongodb,Aggregation Framework,我在MongoDB中与PHP一起使用aggregate。代码如下所示: $results = $c->aggregate(array( array( '$project' => array( 'day' => array('$dayOfYear' => '$executed') ), ), array( '$group' => array( '_id' => a

我在
MongoDB
中与
PHP
一起使用
aggregate
。代码如下所示:

$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,然后再排序345346。。。我需要它的日期升序。因此,基本上,我不需要简单地做
$dayOfYear
,而需要像
$year-$month-$dayOfMonth
这样的东西

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


谢谢。

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

$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
你不应该对整个
\u id
进行排序,因为你已经将它设置为包含一个对象(可以进行奇怪的排序),所以将
$sort
更改为这一点,以特别地按照一年的哪一天进行排序:

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

谢谢,效果很好。MongoDB级别是否有任何方法可以包含0行的天数。基本上我想显示最后30天,但上面返回的是30行,但不是最后30天。@Justin问得好,但据我所知,还不是因为依赖行日期来实际填充行。我相信您目前需要在客户端执行此操作。@Sammaye-我已经在上面的代码中建议并编辑了。您当前的代码,即<代码>'$sort'=>[''u id'=>1]将仅按天对其进行排序,并将产生如下顺序-
2015年10月1日、2015年10月2日、2015年9月4日、2015年9月6日。。。等等。