MongoDB Aggregation 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 ().

Я пытаюсь использовать агрегированную функцию MongoDB в php для группировки по client_id, а использование часов и счетчиков для отображения в таблице / графике

Это моя текущая попытка

 $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 ) ) 

Любой, кто может указать мне в правильном направлении или иметь другое решение для группы по часам?

–Fixed– 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), ) ))); 

Он не должен создавать результаты, которые вы видите, но вам нужно включить 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 }