2017-11-02 15 views
1

dbref로 그룹화 할 수있는 집계 쿼리를 수행하고 싶습니다. 이것이 제가 시도한 것입니다. 당신이 '$foreign.$id'의 두 번째 $ 기호를 사용할 수 없습니다 있기 때문에Doctrine을 사용하여 MongoDB의 dbref에 그룹화하는 방법

$aggregation = array(
    array(
     '$group' => array(
      '_id' => '$foreign.$id', 
      'doc' => array(
       '$last' => '$$ROOT' 
      ) 
     ) 
    ), 
    array(
     '$sort' => array(
      'date' => -1 
     ) 
    ) 
); 

return $this->getDocumentManager()->getDocumentCollection('AppBundle:Collection')->aggregate($aggregation)->toArray(); 

는하지만이 시도가 실패합니다. 이 쿼리를 어떻게 수행 할 수 있습니까?

답변

1

많은 검색을 한 결과 기본적으로이/012와 유사한 문제를 다루는이 Bug Ticket on the monogdb Jira을 발견했습니다.

이 티켓의 last comment은 문제를 명령 줄 코드로 해결할 수있는 대안을 제공합니다. 이 솔루션을 가져 와서 내 문제를 해결하는 집계 쿼리에 구축했습니다.

$aggregation = array(
    array(
     '$addFields' => array(
      'foreignId' => array(
       '$arrayToObject' => array(
        '$map' => array(
         'input' => array(
          '$objectToArray' => '$foreign' 
         ), 
         'in' => array(
          'k' => array(
           '$cond' => array(
            array(
             '$eq' => array(
              array(
               '$substrCP' => array(
                '$$this.k', 0, 1 
               ) 
              ), 
              array(
               '$literal' => '$' 
              ) 
             ) 
            ), 
            array(
             '$substrCP' => array(
              '$$this.k',1,['$strLenCP' => '$$this.k'] 
             ) 
            ), 
            '$$this.k' 
           ) 
          ), 
          'v' => '$$this.v' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ), 
    array(
     '$group' => array(
      '_id' => '$foreignId', 
      'doc' => array(
       '$last' => '$$ROOT' 
      ) 
     ) 
    ), 
    array(
     '$sort' => array(
      'date' => -1 
     ) 
    ) 
); 
$this->getDocumentManager()->getDocumentCollection('AppBundle:Collection')->aggregate($aggregation)->toArray(); 

이 쿼리는 나에게 정확하고 예상되는 결과를 제공합니다.