2013-01-02 138 views
1

我有以下格式MongoDB的聚集PHP,數小時集團

{ 
    "_id" : ObjectId("12e123123123123123"), 
    "client_id" : "12345667889", 
    "resource" : "test/test", 
    "version" : "v2", 
    "ts" : new Date("Wed, 02 Jan 2013 15:34:58 GMT +08:00") 
} 

ts是MongoDate()字段的文件。

我試圖通過CLIENT_ID和小時使用MongoDB的聚合函數在PHP組數使用率在表/圖

這是我目前的嘗試

$usage = $this->db->Usage->aggregate(array(array(
    '$project' => array(
    'hour' => array(
     'years' => array('$year' => '$ts'), 
     'months' => array('$month' => '$ts'), 
     'days' => array('$dayOfMonth' => '$ts'), 
     'hours' => array('$hour' => '$ts'), 
    ) 
), 
    '$group' => array(
    '_id' => array(
     'client_id' => '$client_id', 
     'hour' => '$hour', 
    ), 
    'number' => array('$sum' => 1), 
) 
))); 

不幸的是我的迴應,我顯示我回來只是由client_id分組,沒有別的。

[result] => Array 
    (
     [0] => Array 
      (
       [_id] => Array 
        (
         [client_id] => adacf8deba7066e4 
        ) 

       [number] => 12 
      ) 

    ) 

任何人都能指向正確的方向,或有另一種解決方案按小時分組?

- 修正 - PHP要求您將每個管道放在一個單獨的數組中,並將整個數組放入一個數組中。看到更新的幫助從JohnnyHK

$usage = $this->db->Usage->aggregate(array(array(
     '$project' => array(
      'client_id' => 1, 
      'hour' => array(
       'years' => array('$year' => '$ts'), 
       'months' => array('$month' => '$ts'), 
       'days' => array('$dayOfMonth' => '$ts'), 
       'hours' => array('$hour' => '$ts'), 
      ) 
     )),array(
     '$group' => array(
      '_id' => array(
       'client_id' => '$client_id', 
       'hour' => '$hour', 
      ), 
      'number' => array('$sum' => 1), 
     ) 
    ))); 

回答

4

下面的解決方案不應該創建你所看到的結果,但你確實需要包括client_id$project運營商,以便它提供給$group運營商。

'$project' => array(
    'client_id' => 1, 
    'hour' => array(
    'years' => array('$year' => '$ts'), 
    'months' => array('$month' => '$ts'), 
    'days' => array('$dayOfMonth' => '$ts'), 
    'hours' => array('$hour' => '$ts'), 
) 
), 

外殼等效工作後,我做了改變:

db.test.aggregate(
    { $project: { 
     hour: { 
      years: {$year: '$ts'}, 
      months: {$month: '$ts'}, 
      days: {$dayOfMonth: '$ts'}, 
      hours: {$hour: '$ts'} 
     }, 
     client_id: '$client_id' 
    }}, 
    { $group: { 
     _id: { client_id: '$client_id', hour: '$hour' }, 
     number: { $sum: 1} 
    }}) 

返回:

{ 
    "result": [ 
    { 
     "_id": { 
     "client_id": "12345667889", 
     "hour": { 
      "years": 2013, 
      "months": 1, 
      "days": 2, 
      "hours": 7 
     } 
     }, 
     "number": 1 
    } 
    ], 
    "ok": 1 
} 
+0

我收到了同樣的反應。我在shell中嘗試了同樣的結果,並且得到相同的錯誤結果,這使我認爲它與我的Collection的設置或Mongodb本身的方式有關。我正在運行2.2.2版本。 – Balthasar

+0

奇怪。我添加了我用來用MongoDB v2.2.2測試這個的shell。 – JohnnyHK

+0

真棒修復它。這是PHP需要通過變量的方式。儘管在項目中需要添加client_id。我將用解決方案更新我的問題。 – Balthasar