【问题标题】:How to "group by" field "count" in mongodb querybuilder?如何在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

标签: php mongodb symfony doctrine-odm odm


【解决方案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']; });要对我的数组进行排序,感谢其他提示;]
猜你喜欢
  • 1970-01-01
  • 2014-10-15
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2020-03-19
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多