2016-11-22 5 views
2

私は彼らが持っている製品で都市を分類したいと思います。mongodb querybuilderの "count by"フィールドをグループ化する方法は?

私は2つのドキュメントを持っています:製品と都市。私は、クエリ

[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、申し訳ありませんが、ここで質問するためにインスタンス名を変更しました。私はまた、mongodbのためのグループを試み、動作しませんでした。 :x –

答えて

3

あり、この例では、私の作品:

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

あなたはより多くの例が必要な場合:http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/query-builder-api.html#group-queries

あなたがするかどうか数量で分けて、私は使用をお勧めします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を使用しました($ array、function($ a、$ b){ return $ b ['value'] - $ a ['value']; }); アレイをソートするには、他のチップに感謝します;] –

関連する問題