如何在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