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);
        //多层级查询条件
        // 展开第一层级数组commentThreads
        AggregationOperation unwind1 = Aggregation.unwind(COMMENTTHREADS);
        // 展开第二层级数组commentThreads.comments
        AggregationOperation 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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/710586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么把Rmvb改成mp4格式?把rmvb改成MP4格式的四种方法

怎么把Rmvb改成mp4格式&#xff1f;在当今的数字时代&#xff0c;视频文件格式的多样性给我们带来了巨大的便利&#xff0c;但也可能带来一些兼容性的问题。rmvb是一种曾经非常流行的视频文件格式&#xff0c;主要由于其较高的压缩效率和相对不错的画质。然而&#xff0c;随着技…

计算机组成原理学习 Part 1

计算机系统 组成 计算机系统 { 硬件 计算机的实体&#xff0c;如主机、外设等 软件 由具有各类特殊功能的信息&#xff08;程序&#xff09;组成 计算机系统 \begin{cases} 硬件 &\text 计算机的实体&#xff0c;如主机、外设等\\ 软件 &\text 由具有各类特殊功能的信…

把Vue项目从Window系统迁移到Mac系统的方案

不能启动vue ui 直接运行&#xff0c;会报错如下&#xff1a; failed to load config from /Users/xiaochen/IdeaProjects/ChatViewer-frontend/vite.config.tserror when starting dev server: Error: You installed esbuild for another platform than the one youre curre…

宝藏速成秘籍(6)归并排序法

一、前言 1.1、概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法。它将数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法&#xff0c;它的核心思想是将待…

探索交互设计:五大关键维度全面剖析

交互式设计是用户体验&#xff08;UX&#xff09;设计的重要组成部分。在本文中&#xff0c;我将向大家解释什么是交互设计并简要描述交互设计师通常每天都做什么。 一、什么是交互设计 交互式设计用简单的术语来理解就是用户和产品之间的交互。在大多数情况下&#xff0c;当…

详解MySQL中的PERCENT_RANK函数

目录 1. 引入1. 基本使用2&#xff1a;分组使用3&#xff1a;处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中&#xff0c;PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …

【LLM】吴恩达『微调大模型』课程完全笔记

Finetuning Large Language Models 版权说明&#xff1a; 『Finetuning Large Language Models』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不…

会声会影封面图怎么设置 会声会影渲染封面如何固定 会声会影视频剪辑软件制作教程

使用会声会影剪辑完成过后&#xff0c;通常我们需要给我们的视频设置封面&#xff0c;渲染封面又需要进行固定。本文将围绕会声会影封面图怎么设置和会声会影渲染封面如何固定来进行介绍。 一、会声会影封面图怎么设置 会声会影不能随意自定义设置封面&#xff0c;默认情况下…

中国姓名学十大权威专家颜廷利:全国排名第一的起名大师

颜廷利教授,是济南市历城区唐王镇的名人,位居2023年中国当代十大国学大师排行榜之首。全国排名第一的起名大师颜廷利教授以其深厚的学术造诣和卓越的贡献赢得了名誉和尊重,成为当代国学界的翘楚。他从事国学研究已有数十年,对经史子集的研究融会贯通,展现出了非凡的学术造诣。中…

Navicate操作某一张表后,卡主,无法加载,也无法编辑,更无法读取

说明 Navicate操作某一张表后&#xff0c;卡主&#xff0c;无法加载&#xff0c;也无法编辑&#xff0c;更无法读取&#xff0c;遇到这种情况&#xff0c;一般是因为表被锁住了 解决方案 右击数据库&#xff0c;打开命令号界面 查看进程列表 SHOW PROCESSLIST;mysql> …

FreeRTOS:4.内存管理

FreeRTOS内存管理 目录 FreeRTOS内存管理1. 为什么不直接使用C库函数的malloc和free函数2. FreeRTOS的五种内存管理方式3. heap4源码分析3.1 堆内存池3.2 内存块的链表数据结构3.3 堆的初始化3.4 堆的内存分配3.5 堆的内存释放 4. 总结 1. 为什么不直接使用C库函数的malloc和fr…

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码

LIMS&#xff08;实验室&#xff09;信息管理系统源码、有哪些应用领域&#xff1f;采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统&#xff0c;是一种基于计算机硬件和数据库技术&#xff0c;集多个功能模块为一体的信息管理系统。该系统主…

利用钉钉机器人和PHP开发一款免费的网站可用性检测工具,单节点版

前言 手里有几套系统正在运维&#xff0c;需要保障正常运行&#xff0c;所以可用性检测就必不可少啦&#xff0c; 以前本来是用的阿里官方的云监控&#xff0c;但现在价格感觉太贵了&#xff0c;不划算 那就自己手搓一个简易版的监控吧。 成品效果展示 代码展示 <?php …

2024年哪4种编程语言最值得学习?看JetBrains报告

六个月前,编程工具界的大牛JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中挑出了关于全球程序员过去一年使用编程语言的情况和未来的采纳趋势,总结出2024年最值得学习的四种编程语言。一起来看看吧。 JetBrains在2023年中开始,就向全球的编程达人们发出了问卷…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…

笔记本硬盘对拷:升级硬盘的好方法!

如今电子产品更新换代的速度不断加快&#xff0c;笔记本电脑的配置也日新月异。几年前购买的笔记本硬盘容量350G曾经令你感到相当满意。但时至今日&#xff0c;这样的容量是否已经显得有些落后&#xff1f;如果你想要升级硬盘&#xff0c;笔记本硬盘对拷是一个很好的选择。 需要…

工业园区的弱电智能化总体建设规划

在当今迅速发展的工业环境中&#xff0c;一个高效、智能的工业园区是企业成功的重要基石。随着技术的进步&#xff0c;弱电系统的智能化已不仅仅是便利的象征&#xff0c;更是安全生产和效率提升的必要条件。今天&#xff0c;我们将探讨如何通过弱电智能化系统的总体建设规划来…

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业&#xff0c;八大员证的持有者是广受尊重的专业人士。然而&#xff0c;要成为一名合格的八大员&#xff0c;首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片&#xff0c;以确保个人信息准确无误。那么&#xff0c;你是否清楚报名时照片的要求以…

Stable Diffusion 【AI绘画提示词】摄影效果提示词,超美摄影效果摄影特效!让平凡的照片焕发出独特的魅力!

高端的摄影作品需要的专业设备价格昂贵&#xff0c;并不是一般人能够承受的起的&#xff0c;优质摄影作品对光线等一系列要求也非常的高&#xff0c;而AI摄影就完美的解决了这些问题&#xff0c;只需要配合适当的提示词&#xff0c;这些问题都可以迎刃而解。 AI绘画没灵感&…

2024最新最全【Linux常用指令】从零基础入门到精通,看完这一篇就够了

一些能在手机上运行的渗透工具&#xff0c;如下所示&#xff1a; 1. AndroRAT&#xff1a;一款Android远程管理工具&#xff0c;可用于攻击和控制Android设备。 2. DroidSheep&#xff1a;一款用于截取Android设备上所有网络流量的工具。 3. zANTI&#xff1a;一款用于测试网…