2016-11-22 8 views
2

나는 가지고있는 제품으로 도시를 분류하고 싶다.mongodb querybuilder에서 "count by"필드를 "그룹화"하는 방법은 무엇입니까?

두 개의 문서가 있습니다 : 제품 및 도시. 내가 쿼리

[Atlant => 23, New York => 35, Michigan => 23, etc..] 

하지만 결과를 얻을 수 없다는 결과로 원하는

Product(id)    City 

P1 ------------  Atlanta 

P2 ------------  New York 

P3 ------------  Michigan 

P4 ------------  Atlanta 

     .... 

:이 제품은 ID와 도시의 문서에 대한 참조를 가지고있다.

내 실제 코드는

public function countBestUsers() 
    { 
     return $this->createQueryBuilder() 
      ->select('id', 'city') 
      ->distinct('city') 
      ->getQuery() 
      ->execute() 
      ; 
    } 
+1

'distinct'대신 'group by city'를 사용하십시오. – aynber

+0

@aynber, 죄송합니다. 여기서 질문을하기 위해 인스턴스 이름을 변경했습니다 - 수정 됨. 나 또한 몽고 그룹을 위해 노력했지만 일하지 않았다. : x –

답변

3

당신은 그룹과 시도하고 감소시킬 수있다,이 예제는 나를 위해 작동 : http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/query-builder-api.html#group-queries

당신이 경우 :

$count = $dm->createQueryBuilder()->hydrate(false) 
     ->group(array('city.$id' => 1), array('value' => 0)) 
     ->reduce('function (curr,result) { 
      result.value++; 
     }') 
     ->getQuery() 
     ->execute()->toArray(); 

당신이 더 많은 예제가 필요한 경우 수량에 따라 정렬하려면 사용을 권장합니다. aggregate Framework :

$pipeline = array('$group' => array(
     '_id' => '$city', 
     'value' => array('$sum' => 1) 
    ))); 

array_push($pipeline, array('$sort' => array('value' => -1))); 

$count = $dm->getDocumentCollection('YourBundle:Product') 
      ->aggregate($pipeline)->toArray(); 
+0

꽤 잘 작동합니다. 벌써 고마워! 또한 양에 따라 분류 할 수있는 코드가 있습니까? –

+2

이 경우 통합 프레임 워크를 사용하는 것이 좋습니다. https://docs.mongodb.com/v3.2/aggregation/ 집계로 예제를 작성하려면 내 대답을 편집하겠습니다. – panche14

+1

안녕하세요 @ panche14, 내가 사용 usort ($ 배열, 함수 ($ a, $ b) { 반환 $ b [ '값'] - $ a [ '값'], }); 내 배열을 정렬하려면 다른 팁을 주셔서 감사합니다] –