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]);
相关推荐
明月看潮生18 分钟前
青少年编程与数学 02-007 PostgreSQL数据库应用 11课题、视图的操作
数据库·青少年编程·postgresql·编程与数学
阿猿收手吧!25 分钟前
【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}
数据库·redis·缓存
奈葵29 分钟前
Spring Boot/MVC
java·数据库·spring boot
leegong2311137 分钟前
Oracle、PostgreSQL该学哪一个?
数据库·postgresql·oracle
中东大鹅43 分钟前
MongoDB基本操作
数据库·分布式·mongodb·hbase
夜光小兔纸1 小时前
Oracle 普通用户连接hang住处理方法
运维·数据库·oracle
兩尛3 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
web2u3 小时前
MySQL 中如何进行 SQL 调优?
java·数据库·后端·sql·mysql·缓存
Elastic 中国社区官方博客4 小时前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记4 小时前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存