ThinkPHP中使用MongoDB的union操作

news/2025/3/1 6:55:46/

      MongoDB的union操作是什么。Union类似于SQL中的UNION ALL,可以将多个查询结果合并,并去除重复文档;

使用ThinkPHP 5或更高版本,通常会通过MongoDB的驱动或者第三方库来操作。不过,标准的MongoDB驱动可能不直接支持union操作,所以需要构造多个查询,分别执行然后合并结果

检查MongoDB版本:确保使用的MongoDB版本支持union操作(MongoDB 3.6+)。

​构造子查询:每个子查询对应一个聚合管道,使用match、project等阶段筛选和投影需要的字段。

​执行union操作:使用MongoDB的$union聚合阶段将多个子查询的结果合并。

​在Think PHP中实现:通过MongoDB的客户端执行聚合管道,包含$union阶段。

安装 MongoDB 扩展:确保 PHP 已安装 mongodb 扩展。

配置 ThinkPHP 数据库连接

'_mongo' => [ 
// 数据库类型 
'type' => '\think\mongo\Connection', 
// 设置查询类 'query' => '\think\mongo\Query', 
// 服务器地址 'hostname' => MyEnv::get('DATABASE.all_mongo_hostname'), 
// 集合名 'database' => MyEnv::get('DATABASE.all_mongo_database'), 
// 用户名 'username' => MyEnv::get('DATABASE.all_mongo_username'), 
// 密码 'password' => MyEnv::get('DATABASE.all_mongo_password'), 
// 端口 'hostport' => MyEnv::get('DATABASE.all_mongo_hostport', '8365'), 
// 强制把_id转换为id 'pk_convert_id' => true, 'params'=> ['replicaSet' => 'replica'],
],

single_chat当前的聊天集合是按照年月进行聚合存储的 例如:single_chat202412,single_chat202501,single_chat202502,查询多个集合的数据的时候可以采用如下实现方式:

具体的实现代码

//获取数据

php">$months = self::getMonths($data['over_time'], $data['begin_time']);
$password = config('database._mongo.password'); //密码
$hostname = config('app.mongoUrl');
$url = "mongodb://user123456:" . $password . "@" . $hostname;
$mongo = new Manager($url);
$databaseName = 'single_chat';
$months = array_reverse($months);
$collection = new Collection($mongo, $databaseName, $months[0] . 'signChat');
$pipeline = [];
$matchOptions['chatName'] = $aggregate_name;
$matchOptions['action'] = ['$ne' => 'action'];
$matchOptions['msgtype'] = 'text';
$match = ['$match' => $matchOptions
];
$num=count($months);
for ($i = 1; $i < $num; $i++) {$unionWith = ['$unionWith' => ['coll' => $months[$i] . 'signChat', // 合并的集合名称'pipeline' => [$match]]];$pipeline[] = $unionWith;$pipelineCommon[] = $unionWith;
}
$match = ['$match' => $matchOptions];
$sort = ['$sort' => ['seq' => -1 // -1 表示降序排序,1 表示升序排序]
];
$count = ['$count' => 'total' // 计算合并后的总文档数
];
$pipelineCommon[] = $sort;
$pipelineCommon[] = $match;
$pipeline[] = $match;
$page = (int)$data['page'];
$pageSize = (int)$data['pageSize'];
$skip = ['$skip' => ($page - 1) * $pageSize// 跳过指定数量的文档,用于分页
];
$limit = ['$limit' => $pageSize // 限制返回的文档数量,即每页的大小
];
$pipelineCommon[] = $skip;
$pipelineCommon[] = $limit;
$pipeline[] = $count;
$results = $collection->aggregate($pipeline)->toArray();
if (isset($results[0]['total'])) {$totalNum = $results[0]['total'];$chatListMongo = $collection->aggregate($pipelineCommon)->toArray();
} else {$totalNum = 0;$chatListMongo = [];
}
$return['total'] = $totalNum;
$return['per_page'] = $data['pageSize'];
$return['current_page'] = $data['page'];;
$return['last_page'] = ceil($return['total'] / $return['per_page']);

以上就是全部的实现方式了,如果能帮到各位,帮个点个赞~


http://www.ppmy.cn/news/1575707.html

相关文章

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析实践应用

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

大白话React第七章深入学习 React 高级特性与优化阶段

大白话React第七章深入学习 React 高级特性与优化阶段 1. React Hooks 的深入学习 React Hooks 就像是给 React 开发者的一套超好用的工具包&#xff0c;让我们能更轻松地处理组件的状态和其他功能&#xff0c;而且不用像以前写类组件那么麻烦。 useEffect 钩子&#xff1a;…

【C++】移动语义

C的移动语义&#xff08;Move Semantics&#xff09;是C11引入的一个特性&#xff0c;旨在提高程序性能&#xff0c;特别是在对象的临时性和资源管理方面。通过允许“移动”对象&#xff0c;而不是复制对象&#xff0c;移动语义减少了不必要的资源复制&#xff0c;从而提升了效…

如何利用爬虫获取淘宝评论API接口:技术解析与实战指南

在电商领域&#xff0c;商品评论数据是商家优化产品、提升用户体验以及进行市场分析的关键资源。淘宝作为国内领先的电商平台&#xff0c;提供了丰富的API接口&#xff0c;允许开发者通过编程方式获取商品评论信息。本文将详细介绍如何利用Python爬虫技术调用淘宝评论API接口&a…

强制完整性级别(MIL)和用户账户控制(UAC)的联系与区别

强制完整性级别&#xff08;MIL&#xff09; 和 用户账户控制&#xff08;UAC&#xff09; 都是 Windows 操作系统中的安全机制&#xff0c;旨在增强系统的安全性并防止恶意软件和攻击者在系统中获得更高的权限。尽管它们有共同的目标&#xff0c;但它们的工作原理、应用范围和…

DeepSeek R1 训练策略4个阶段解析

DeepSeek R1 训练策略解析 DeepSeek R1 训练策略解析1. 冷启动监督微调&#xff08;Cold Start SFT&#xff09;**该阶段的主要目标**&#xff1a; 2. 面向推理的强化学习&#xff08;RL for Reasoning&#xff09;**该阶段的主要目标**&#xff1a; 3. 拒绝采样和监督微调&…

包装类缓存对象

在 Java 中&#xff0c;包装类&#xff08;如 Integer、Long、Character 等&#xff09;为了提高性能和节省内存&#xff0c;对一定范围内的值进行了缓存。这种缓存机制使得在某些情况下&#xff0c;相同的值会返回相同的对象&#xff0c;而不是创建新的对象。 1. 包装类的缓存…

基于 Python 开发在线多人游戏服务器案例解析

基于 Python 开发在线多人游戏服务器案例解析 本文详细介绍基于 Python 开发在线多人游戏服务器的案例。通过阐述服务器架构设计、网络通信实现、玩家管理以及游戏逻辑处理等方面&#xff0c;展示 Python 在网络应用开发中的强大能力&#xff0c;为游戏开发者和网络编程爱好者…