2013-01-02 16 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() 필드는 문서를 가지고있다.

내가 표/그래프

이 내 현재 시도

$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 및 시간에 의해 그룹에 PHP에서 MongoDB를 집계 함수를 사용하고 사용량을 계산하려고 다시 얻는 것은 client_id만으로 그룹화하는 것입니다.

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

       [number] => 12 
      ) 

    ) 

올바른 방향으로 나를 가리킬 수 있거나 시간 단위로 분류 할 수있는 사람이 있습니까?

--Fixed-- PHP는 각 파이프 라인을 별도의 배열에 넣고 모든 것을 배열에 넣어야합니다. 그것은 당신이보고있는 결과를 만들 수 없습니다해야하지만, 그것은 $group 운영자에게 사용할 수 있도록 당신이 당신의 $project 운영자에 client_id을 포함해야합니까 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

의 도움으로 아래의 업데이트 솔루션을 참조하십시오.

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

나도 같은 반응을 얻고 난 그 변경 한 후

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

쉘 해당

일했다. 나는 쉘에서 같은 것을 시도해 보았고 동일한 잘못된 결과를 얻고있다. 그래서 내 콜렉션이 설치되어 있거나 몽고 쓰 자체와 관련이 있다고 생각하게 만든다. 2.2.2 버전을 실행 중입니다. – Balthasar

+0

이상한. MongoDB v2.2.2에서 이것을 테스트하기 위해 사용하고있는 쉘 셸을 추가했습니다. – JohnnyHK

+0

굉장히 고쳤습니다. 그것은 PHP가 변수를 통과하는 데 필요한 방법이었습니다. 프로젝트에서 client_id를 추가해야했습니다. 나는 해결책으로 내 질문을 업데이트 할 것이다. – Balthasar