2013-01-05 90 views
4

我在MongoDBPHP使用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

不幸的是,这是行不通的。有任何想法吗?

谢谢。

回答

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

+0

非常感谢您的工作。有没有办法在MongoDB级别包含0行的日期。基本上我想显示过去30天,但是上面返回30行,但不是最后30天。 – Justin

+0

@Justin好的问题,但不是从我所知道的,因为依靠行日期实际上填充行。我相信你现在需要做这个客户端。 – Sammaye

+0

@Sammaye - 我已经建议并在上面的代码中编辑。您当前的代码,因为它是.i.e。 ''$ sort'=> ['_id'=> 1]'只会在白天进行排序,并且会导致如下命令 - “1/10/2015,2015/2/10,2015/4/9, 6/9/2015 ...等等 – ShalomSam

0

,因为你已经设置了包含一个对象(可以排序奇怪的),所以不是专门按年份的天改变你的$sort这个你不应该对整个_id排序:

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