2013-12-15 160 views
0

我試圖輸出按日期分組的日期數組,其字段總數爲minutes_numericmongoDB PHP按日期和總和字段按日期收集

我當前的查詢是:

return $this->db->Work->aggregate(array(
      array(
       '$match' => array(
        'date' => array('$gt' => $start, '$lt' => $end) 
       ) 
      ), 
      array(
       '$project' => array(
        'year' => array('$year' => '$date'), 
        'month' => array('$month' => '$date'), 
        'day' => array('$dayOfMonth' => '$date'), 
       ), 
      ), 
      array(
       '$group' => array(
        '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'), 
        'minutes_numeric' => array('$sum' => 1) 
       ), 
      ), 
      array(
       '$sort' => array(
        '_id' => 1 
       ), 
      ), 
      array(
       '$limit' => 30 
      ) 
     )); 

,輸出:

{ 
result: [ 
{ 
_id: { 
year: 2013, 
month: 12, 
day: 4 
}, 
minutes_numeric: 40 
}, 
{ 
_id: { 
year: 2013, 
month: 12, 
day: 11 
}, 
minutes_numeric: 127 
}, 
{ 
_id: { 
year: 2013, 
month: 12, 
day: 12 
}, 
minutes_numeric: 108 
} 
], 
ok: 1 
} 

這是偉大的,但是minutes_numeric代表行的那一天的數目,所以我改變了$group條款:

array(
     '$group' => array(
      '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'), 
      'minutes_numeric' => array('$sum' => '$minutes_numeric') 
     ), 
    ), 

然後改變sum(minutes_numeric)爲0而不是實際的總和。

我不確定爲什麼我的總和是哪裏錯了,任何幫助是極大的讚賞


編輯,

如果我更新$項目包括minutes_numeric然後總和似乎排除$匹配參數

array(
      '$project' => array(
       'year' => array('$year' => '$date'), 
       'month' => array('$month' => '$date'), 
       'day' => array('$dayOfMonth' => '$date'), 
       'minutes_numeric' => 1 
      ), 
     ), 
     array(
      '$group' => array(
       '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'), 
       'minutes_numeric' => array('$sum' => '$minutes_numeric') 
      ), 
     ) 
+0

對不起,我不明白「總和似乎排除$匹配參數」,你是什麼意思? –

+0

您可以在編輯完成後與我們分享結果嗎? –

+0

請提供您收藏中的實際文檔。我懷疑「minutes_numeric」不是一個簡單的頂級字段。 –

回答

0

如果這是你當前的查詢

return $this->db->Work->aggregate(array(
      array(
       '$match' => array(
        'date' => array('$gt' => $start, '$lt' => $end) 
       ) 
      ), 
      array(
       '$project' => array(
        'year' => array('$year' => '$date'), 
        'month' => array('$month' => '$date'), 
        'day' => array('$dayOfMonth' => '$date'), 
        'minutes_numeric' => 1 
       ), 
      ), 
      array(
       '$group' => array(
        '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'), 
        'minutes_numeric' => array('$sum' => '$minutes_numeric') 
       ), 
      ), 
      array(
       '$sort' => array(
        '_id' => 1 
       ), 
      ), 
      array(
       '$limit' => 30 
      ) 
     )); 

那麼你的$匹配參數被「忽略」,結果不是你所期望的唯一方法可能是因爲它們是錯誤的。嘗試檢查$ start和$ end的值,因爲您使用的查詢似乎是正確的。

如果這不是問題,請用您當前查詢的結果更新您的問題。 (也更新您的查詢,如果它不是我的答案中的那個)

+0

實際上,日期範圍應該是$ gte而不是$ gt。但我懷疑真正的問題是,minutes_numeric不是頂級字段。 –

+0

你的意思是你試圖在查詢中動態地計算minutes_numeric,並且它實際上並不存在於集合的字段中,對吧?如果是這樣,請解釋你打算如何計算它。 – Calimero

+0

在一個聚合管道的$ group對象中,您可以動態計算/創建一個新的字段,所以我不認爲這個字段存在於集合文檔中的天氣是否存在問題。 $ gt vs $ gte也不是$ match參數被「排除」的原因(不管這可能是什麼意思)。 –