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日。。。等等。