如何在 mongodb querybuilder 中 "group by" 字段 "count"?

How to "group by" field "count" in 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()
            ;
    }

你可以尝试使用 group 和 reduce,这个例子对我有用:

$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();