如何在mongodb querybuilder中“分组”字段“计数”?

Posted

技术标签:

【中文标题】如何在mongodb querybuilder中“分组”字段“计数”?【英文标题】:How to "group by" field "count" in mongodb querybuilder? 【发布时间】:2017-04-06 09:26:58 【问题描述】:

我想用他们拥有的产品对城市进行分类。

我有两个文件:产品和城市。产品有自己的 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 by city 而不是distinct @aynber,对不起,我更改了实例名称以在这里提出问题 - 已修复。我还尝试了 mongodb 的组,但没有用。 :x 【参考方案1】:

你可以尝试使用 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();

【讨论】:

效果很好。已经谢谢你了!您是否还有一些代码可以按数量对其进行排序? 在这种情况下,我建议您使用聚合框架docs.mongodb.com/v3.2/aggregation 我将编辑我的答案以使用聚合为例。 嗨@panche14,我使用了 usort($array, function($a, $b) return $b['value'] - $a['value']; );要对我的数组进行排序,感谢其他提示;]

以上是关于如何在mongodb querybuilder中“分组”字段“计数”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 中为使用 queryBuilder 构建的 MongoDB 查询编写单元测试

如何使用 Studio 3T Query Builder 进行数据查询

如何在Knex中扩展QueryBuilder类时访问当前上下文的事务

symfony2:如何在 QueryBuilder 中使用 group_concat

如何使用 Cassandra 中的 QueryBuilder 定义具有 2 个条件的 Where 查询?

Laravel 使用 QueryBuilder 时如何避免页面重新加载