Yii2 mongodb分组查询

php 复制代码
        $data = MongoDbModelName::getCollection()->aggregate([
            [
                '$group' => [
                    '_id' => '$user_id', //通过user_id分组去重
                    'total' => [
                        '$sum' => 1
                    ]
                ],
            ],
            [
                '$match' => [
                    'total' => [
                        '$gt' => 1
                    ]
                ]
            ]
        ],['allowDiskUse' => true]);

相当于

sql 复制代码
select user_id,count(1) as total from MongoDbCollection group by user_id having count(1) > 1

aggregate的第二个参数['allowDiskUse' => true],是表示允许使用内存,比如数据量大的时候,可以加上这个;如果数据量小的话,这个参数可以直接去掉。 如果需要按两个字段进行分组的话,可以将 $group 的_id指定为数组,如下:

php 复制代码
$data = MongoDbModelName::getCollection()->aggregate([
            [
                '$group' => [
                    '_id' => ["aid":"$aid","user_id":"$user_id"],  //通过aid和user_id分组
                    'total' => [
                        '$sum' => 1
                    ]
                ],
            ],
            [
                '$match' => [
                    'total' => [
                        '$gt' => 1
                    ]
                ]
            ]
        ],['allowDiskUse' => true]);

相当于

sql 复制代码
select aid,user_id,count(1) as total from MongoDbCollection group by aid,user_id having count(1) > 1

如果要限制输出条数。可以在aggregate的第一个参数数组尾部中增加["$limit" => 1],必须是尾部,因为aggregate的会使用第一个参数的元素进行过滤,第一个元素过滤后的结果会给第二个元素,依次内推;实例如下

php 复制代码
$data = MongoDbModelName::getCollection()->aggregate([
            [
                '$group' => [
                    '_id' => ["aid":"$aid","user_id":"$user_id"],  //通过aid和user_id分组
                    'total' => [
                        '$sum' => 1
                    ]
                ],
            ],
            [
                '$match' => [
                    'total' => [
                        '$gt' => 1
                    ]
                ]
            ],
            [
            	'$limite' => 15
            ]
        ],['allowDiskUse' => true]);
相关推荐
Elastic 中国社区官方博客8 小时前
Elasticsearch:在分析过程中对数字进行标准化
大数据·数据库·elasticsearch·搜索引擎·全文检索
聪明努力的积极向上8 小时前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
代码or搬砖8 小时前
RBAC(权限认证)小例子
java·数据库·spring boot
神仙别闹8 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
2301_768350238 小时前
MySQL为什么选择InnoDB作为存储引擎
java·数据库·mysql
上海蓝色星球9 小时前
迈向智慧电网新纪元:上海蓝色星球数字孪生变电主子站系统
运维·数据库
是大芒果9 小时前
数据库表设计
数据库
哥哥还在IT中9 小时前
MySQL order by 如何优化
数据库·mysql
积跬步,慕至千里9 小时前
postgre数据库大批量快速导出方法总结
数据库·postgres
帅大大的架构之路10 小时前
mysql批量插入数据如何更快
数据库·mysql