2016-11-22 147 views
2

我想用他們擁有的產品來對城市進行分類。如何在mongodb querybuilder中「按字段」「計數」分組?

我有兩個文件:產品和城市。該產品具有它的ID和一個城市的某一個文件:

Product(id)    City 

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

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

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

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

     .... 

我想作爲查詢

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

但我不能夠得到的結果的結果。

我實際的代碼是

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

使用'城市組'而不是'distinct' – 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

Hi @ panche14,我用usort($ array,function($ a,$ b){ return $ b ['value'] - $ a ['value']; }); 要排序我的陣列,謝謝你的另一個提示;] –