当前位置: 首页 > news >正文

MongoDB 多层级查询

多层级查询

注意:要注意代码顺序 查询层级数据代码放前面,查询条件放后面
在这里插入图片描述

    if (StringUtils.isBlank(params.getDocType())) {params.setDocType(DOC_TDCTYPE);}String docName = mapper.findByDocInfo(params.getDocType());List<ExpertApprovalOpinionsVO> expertApprovalOpinionsVOS = new ArrayList<>();String opinion = params.getApprovalOpinions();String chapterName = params.getChapterName();String approvalPerson = params.getApprovalPerson();Criteria criteria = new Criteria();Criteria[] criteriaArray = new Criteria[0];List<AggregationOperation> operations = new ArrayList<>();//分页条件int skip = (page - 1) * pageSize;AggregationOperation skipOperation = Aggregation.skip((long) skip);AggregationOperation limitOperation = Aggregation.limit((long) pageSize);//多层级查询条件// 展开第一层级数组commentThreadsAggregationOperation unwind1 = Aggregation.unwind(COMMENTTHREADS);// 展开第二层级数组commentThreads.commentsAggregationOperation unwind2 = Aggregation.unwind(COMMENTTHREADS_COMMENTS);operations.add(unwind1);operations.add(unwind2);//添加条件查询 ,单个查询条件和 多个 查询值if (StringUtils.isNotBlank(chapterName)) {//查詢出 章节key 用于根据章节key查询 MongoDB 的章节批注意见List<Map<String, Object>> modelKeyList = mapper.findByModelKey(params);if (!modelKeyList.isEmpty()) {// 匹配满足单次正则表达式的文档if (modelKeyList.size() == 1) {Pattern pattern = Pattern.compile(ObjectUtils.toString(modelKeyList.get(0).get(MODEL_KEY)), Pattern.CASE_INSENSITIVE); // 根据您的需要指定模糊匹配的正则表达式和匹配选项MatchOperation match = Aggregation.match(Criteria.where(KEY).regex(pattern));operations.add(match);} else {// 匹配满足批量正则表达式的文档// 章节key集合List<String> threadId = modelKeyList.stream().map(map -> map.get(MODEL_KEY) != null ? String.valueOf(map.get(MODEL_KEY)) : null).filter(Objects::nonNull).collect(Collectors.toList());// 构建匹配条件列表List<Criteria> criteriaList = new ArrayList<>();for (String pattern : threadId) {// 构造正则表达式匹配条件String regexPattern = ".*" + Pattern.compile(pattern) + ".*";criteriaList.add(Criteria.where(KEY).regex(regexPattern));}// 使用$or操作符组合多个条件Criteria orCriteria = new Criteria().orOperator(criteriaList.toArray(new Criteria[criteriaList.size()]));AggregationOperation match2 = Aggregation.match(orCriteria);operations.add(match2);}} else {return expertApprovalOpinionsVOS;}}if (StringUtils.isNotBlank(approvalPerson)) {//模糊查询出用户List<Map<String, Object>> userList = mapper.findByUser(params);if (!userList.isEmpty()) {//用户集合List<String> authorId = userList.stream().map(map -> map.get(USER_ID) != null ? String.valueOf(map.get(USER_ID)) : null).filter(Objects::nonNull).collect(Collectors.toList());criteria = Criteria.where(COMMENTTHREADS_COMMENTS_AUTHORID).in(authorId);AggregationOperation match = Aggregation.match(new Criteria().andOperator(criteria));operations.add(match);} else {return expertApprovalOpinionsVOS;}}if (StringUtils.isNotBlank(opinion)) {Pattern pattern1 = Pattern.compile(opinion, Pattern.CASE_INSENSITIVE);criteria = Criteria.where(COMMENTTHREADS_COMMENTS_CONTENT).regex(pattern1);AggregationOperation match2 = Aggregation.match(criteria);operations.add(match2);}/*** project 新的 数据 包含 "crt_time", "nodeId", "processInstanceId", "nodeCrtTime"* andExclude 排除 "_id"* andExpression 执行 表达式 ,取出对应的 数据值* as 生成的 新数据的 名称*/operations.add(Aggregation.project("crt_time", "nodeId", "processInstanceId", "nodeCrtTime").andExclude("_id").andExpression(COMMENTTHREADS_COMMENTS).as(COMMENTS));operations.add(Aggregation.sort(Sort.Direction.DESC, "crt_time"));operations.add(skipOperation);operations.add(limitOperation);Aggregation aggregation = Aggregation.newAggregation(operations);//查询AggregationResults<Map> result = template.aggregate(aggregation, params.getDocType() + ".approvals", Map.class);//获取结果List<Map> mappedResults = result.getMappedResults();

相关文章:

MongoDB 多层级查询

多层级查询 注意&#xff1a;要注意代码顺序 查询层级数据代码放前面&#xff0c;查询条件放后面 if (StringUtils.isBlank(params.getDocType())) {params.setDocType(DOC_TDCTYPE);}String docName mapper.findByDocInfo(params.getDocType());List<ExpertApprovalOpin…...

grpc代理服务的实现(一)

最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接&#xff0c;目前公司使用的是如下的逻辑(当然逻辑简化了&#xff0c;但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc …...

FastAPI系列 4 -路由管理APIRouter

FastAPI系列 -路由管理APIRouter 文章目录 FastAPI系列 -路由管理APIRouter一、前言二、APIRouter使用示例1、功能拆分2、users、books模块开发3、FastAPI主体 三、运行结果 一、前言 未来的py开发者请上座&#xff0c;在使用python做为后端开发一个应用程序或 Web API&#x…...

数据驱动制造:EMQX ECP 指标监测功能增强生产透明度

迈向未来的工业生产&#xff0c;需要的不仅是自动化&#xff0c;更是智能化。如果工业企业的管理者能够实时监测每一生产环节的设备运行状态&#xff0c;每一数据点位情况&#xff0c;洞察和优化每一步生产流程&#xff0c;他们将能够做出更精准的决策&#xff0c;提高生产效率…...

一行代码实现鼠标横向滚动

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 在项目中我们可能会遇到当鼠标在某个区域内&#xff0c;我们希望滚动鼠标里面的内容可以横向滚动&#xff1b; 比如我们一些常见的后台状态栏&#xff1a; 那这种该怎么写&…...

Flink集群架构

在上一章节我们对flink有了一个基本的了解。从它的应用的场景以及它的一些基本的一些核心的一些概念。从本章节开始&#xff0c;我们对flink从它的一个集群的一个架构以及它的一个部署模式着手&#xff0c;去了解flink如何去部署在不同的这样的一个集群的一些资源管理器上面&am…...

计算机网络(6) UDP协议

一.UDP数据报格式 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种简单的传输层协议&#xff0c;与TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;UDP提供一种无连接、不可靠的数据传…...

单片机(STM32)与上位机传输浮点数

目录 单片机(STM32)与上位机传输数据的方法1. 传输整形数据2. 传输浮点数据3. 如何打包与解包 单片机(STM32)与上位机传输数据的方法 在进行单片机程序的开发时&#xff0c;常常需要与其他设备进行通信。一种情况是与其他电路板通信&#xff0c;比如STM32主机与STM32从机通信&…...

50etf期权交易规则杠杆怎么计算?

今天带你了解50etf期权交易规则杠杆怎么计算&#xff1f;近年来&#xff0c;期权交易在股票市场中变得愈发流行&#xff0c;其中50ETF期权备受关注。作为一种金融衍生品&#xff0c;50ETF期权为投资者提供了更灵活的投资方式和更多的策略选择。 50etf期权交易规则杠杆怎么计算&…...

鸿蒙: 基础认证

先贴鸿蒙认证 官网10个类别总结如下 https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 10节课学习完考试 考试 90分合格 3次机会 1个小时 不能切屏 运行hello world hvigorfile.ts是工程级编译构建任务脚本 build-profile.json5是工程…...

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车&#xff0c;他们可以找到一个折衷方案&#xff0c;即插电式混合动力车。 在过去的16年里&#xff0c;我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车&#xff0c;跟踪汽车行业的新闻…...

上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源

上海交通大学 Linux 用户组发布公告&#xff1a; 即时起中止对 Docker Hub 仓库的镜像。Docker 相关工具默认会自动处理失效镜像的回退&#xff0c;如果对官方源有访问困难问题&#xff0c;建议尝试使用其他仍在服务的镜像源。 源加速地址 有网友表示百度的 Docker Hub 加速器…...

【Linux】shell——条件判断test,各种运算符,expr

条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与&#xff0c;前面为真后面才会执行 || -->逻辑或&#xff0c;前面为假后面才…...

中介子方程二十二

X$XFX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$…...

你还不会选ProfiNET和EtherCAT网线?

在现代工业自动化领域&#xff0c;ProfiNET和EtherCAT是两种非常流行的通信协议。选择合适的网线对于确保通信的稳定性和效率至关重要。 ProfiNET是什么&#xff1f; ProfiNET是一种基于以太网的通信协议&#xff0c;由德国西门子公司开发。它支持实时通信&#xff0c;广泛应用…...

醉美酒话:承载着深厚文化底蕴的敬酒词

这些敬酒词凝聚了中华酒文化的精髓&#xff0c;每一句都体现了对美好愿景的深深祝愿&#xff0c;同时也展示了中文语言的丰富与魅力。 一、“步步高升”酒&#xff1a; 第一杯&#xff0c;酒至三分&#xff0c;象征着龙洒点滴、财运将至。我衷心祝愿您财富如江水般滚滚而来&a…...

vue3-sfc-loader动态加载一个异步vue组件生成cesium画面

在 Vue.js 3 中&#xff0c;使用 vue3-sfc-loader 可以动态加载异步的 Vue 单文件组件&#xff08;.vue 文件&#xff09;。这个工具允许你在运行时根据需要加载和解析 .vue 文件&#xff0c;使得组件的加载变得更加灵活和动态。 下面是一个简单的示例&#xff0c;演示如何使用…...

flink学习-状态管理

状态管理 在flink中&#xff0c;算子可以分为无状态和有状态两种情况。 无状态的算子只需要观察每个独立事件&#xff0c;根据当前输入的数据直接输出结果。像&#xff1a;filter、flatMap、map都属于无状态的算子。 有状态的算子则是除当前数据之外&#xff0c;还需要一些其他…...

OpenCV图像算术位运算

一 图像相加 import cv2 import numpy as npgirlcv2.imread(./2037548.jpg)#图像的加法运算就是矩阵的加法运算 #因此加法运算的两张图必须是相等的print(girl.shape)imgnp.ones((1920,1080,3),np.uint8)*50 cv2.imshow(girl,girl) resultcv2.add(girl,img) cv2.imshow(result…...

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…...

艾尔登法环黑夜君临修改器2026.5.11最新中文汉化版免费下载 转存后自动更新 (看到请立即转存 资源随时失效)

在《艾尔登法环》的庞大世界观下&#xff0c;一款名为《艾尔登法环&#xff1a;黑夜君临》&#xff08;ELDEN RING NIGHTREIGN&#xff09;的衍生作品于 2025 年正式登场。它并非单纯的续作或大型 DLC&#xff0c;而是一款基于原作设定、专注于多人协作生存与浓缩化 RPG 体验的…...

从F103到F407:老STM32玩家升级指南,详解性能差异与项目移植实战

从F103到F407&#xff1a;老STM32玩家升级指南&#xff0c;详解性能差异与项目移植实战 对于熟悉STM32F1系列开发的工程师来说&#xff0c;升级到F407系列既是一次性能跃迁的机会&#xff0c;也伴随着学习曲线和移植挑战。本文将深入剖析两款芯片的差异&#xff0c;并提供可落地…...

打卡信奥刷题(3245)用C++实现信奥题 P8563 Magenta Potion

P8563 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa&#xff0c;其中所有数的绝对值均大于等于 222。有 qqq 次操作&#xff0c;格式如下&#xff1a; 1 i k\texttt{1 i k}1 i k&#xff0c;表示将 aia_iai​ 修改为 kkk。保证 $k $ 的绝对值大于等于 222。 2 l r…...

ArcGIS符号库“隐身”之谜:从DAO组件缺失到完整恢复的实战指南

1. 当符号选择器突然"罢工"&#xff1a;一个GISer的崩溃瞬间 那天早上我正赶着完成客户的地图项目&#xff0c;准备给水系图层换个漂亮的蓝色符号。像往常一样双击图层打开属性窗口&#xff0c;点击Symbol Selector准备挑选样式时&#xff0c;整个人瞬间僵住了——本…...

从无人机到平衡车:MPU6050姿态融合(互补滤波)的实战调参指南与避坑心得

从无人机到平衡车&#xff1a;MPU6050姿态融合实战调参与避坑指南 姿态解算在无人机飞控、平衡车和机器人系统中扮演着核心角色。MPU6050作为一款集成了三轴陀螺仪和三轴加速度计的惯性测量单元(IMU)&#xff0c;其数据融合质量直接决定了系统稳定性。许多开发者虽然理解了互补…...

RSLinx OPC Server配置避坑指南:解决IP网段、Topic配置与标签读取的常见问题

RSLinx OPC Server实战排障手册&#xff1a;从IP冲突到标签解析的深度解决方案 当工业自动化系统遇上OPC Server通讯故障&#xff0c;工程师的调试时间往往以小时为单位流失。不同于基础配置教程&#xff0c;本文将直击RSLinx OPC Server部署中的七大高发故障场景&#xff0c;…...

程序员裸辞转行网络安全,我只用了 90 天

程序员如何90天成功转行黑客&#xff08;网络安全&#xff09;&#xff1f; 有人说&#xff1a;”黑客到底比程序员高在哪&#xff0c;为什么很多人开始转行了“其实黑客都是程序员&#xff0c;但是并不是所有的程序员都是黑客. 从企业和社会需求来看&#xff0c;现在真不缺程…...

告别黑盒:手把手调试MTK Camera HAL3日志,定位拍照卡顿与预览异常

告别黑盒&#xff1a;手把手调试MTK Camera HAL3日志&#xff0c;定位拍照卡顿与预览异常 在移动影像开发领域&#xff0c;MTK平台的Camera HAL3层问题排查常被开发者视为"黑盒操作"。当用户反馈"拍照延迟明显"或"预览画面卡顿"时&#xff0c;缺…...

VideoDownloadHelper实战指南:全网视频一键下载的高效方案

VideoDownloadHelper实战指南&#xff1a;全网视频一键下载的高效方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存心仪的在…...

AI 入门 30 天挑战 - Day 28 - 前沿技术概览

&#x1f31f; 完整项目和代码 本教程是 AI 入门 30 天挑战 系列的一部分&#xff01; &#x1f4bb; GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge&#x1f4d6; CSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐ 欢迎 Star 支持&#xff01;…...