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]);
相关推荐
阿杰学AI13 分钟前
AI核心知识129—大语言模型之 向量数据库(简洁且通俗易懂版)
数据库·人工智能·ai·语言模型·自然语言处理·向量数据库·vector database
SPC的存折15 分钟前
D在 Alpine 容器中手动搭建 Discuz 全攻略(包含镜像一键部署脚本,可直接用)
linux·数据库·mysql·缓存
李兆龙的博客20 分钟前
从一到无穷大 #67 大查询根因分析 - 从 PinSQL 到 RCRank
数据库·时序数据库
AgCl2338 分钟前
MYSQL-6-函数与约束-3/17
android·数据库·mysql
junqiduhang44 分钟前
Win11 MySQL 8.0 安装八步走
数据库·mysql
zhangchaoxies1 小时前
golang如何使用SQLx原生SQL查询_golang SQLx原生SQL查询使用方法
jvm·数据库·python
m0_743623921 小时前
mysql如何优化InnoDB缓冲池大小_mysql缓冲池内存调优
jvm·数据库·python
孟意昶1 小时前
Doris专题31-SQL手册-基础元素
大数据·数据库·数据仓库·分布式·sql·知识图谱·doris
m0_617881421 小时前
如何操作 XML 数据_XMLTYPE 与 EXTRACT 函数解析节点
jvm·数据库·python
qq_334563551 小时前
golang如何实现SSTable持久化_golang SSTable持久化实现要点
jvm·数据库·python