У меня есть документы со следующим форматом
{ "_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 }