2013-01-05 121 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 
),