MongoDB 多层级查询

news2025/1/19 17:04:56

多层级查询

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

    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.coloradmin.cn/o/1832310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 任务积分优化问题(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

配置文件-基础配置,applicationproperties.yml

黑马程序员Spring Boot2 文章目录 1、属性配置2、配置文件分类3、yaml文件4、yaml数据读取4.1 读取单个数据4.2 读取全部属性数据4.3 读取引用类型属性数据 1、属性配置 SpringBoot默认配置文件application.properties&#xff0c;通过键值对配置对应属性修改配置 修改服务器端…

第二十一篇——信道:信息通道的容量有边界嘛?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过这篇文章&#xff0c;形象的知道了信息通道的容量边界&#xff1b;以…

学生党打工人救星,GPT一句话生成精美PPT

学生党打工人救星&#xff0c;GPT一句话生成精美PPT 介绍 在这个快节奏的现代社会&#xff0c;效率是关键。无论是工作会议、学术报告&#xff0c;还是产品展示&#xff0c;一个精美而结构合理的 PPT 都是成功的关键。然而&#xff0c;制作一个高质量的 PPT 往往需要耗费大量…

JavaEE进阶----SpringBoot快速入门

文章目录 前言一、了解Maven1.1 Maven功能- 项⽬构建- 管理依赖 1.2Maven仓库 二、第一个SpringBoot项目总结 前言 Spring Boot是一个用于构建快速、简单和可扩展的生产级应用程序的框架。它基于Spring框架&#xff0c;提供了开发微服务和独立的应用程序所需的一切。 一、了解…

【UIDynamic-动力学-UICollisionBehavior-碰撞模式-创建边界 Objective-C语言】

一、我们来说这个碰撞模式 1.把之前的代码备份一下,改个名字:“04-碰撞行为-碰撞模式”, 然后,command + R,先跑一下, 我现在,一点击,是这个红色的View、和蓝色的View、在发生碰撞, 我们说,碰撞模式是啥意思, collision里边,有一个叫做collisionMode, UICollis…

高考分数限制下,选好专业还是选好学校?

高考分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 高考作为每年一度的盛大考试&#xff0c;不仅关乎学生们的未来&#xff0c;更承载了家庭的期望。2004年高考刚刚结束&#xff0c;许多考生和家长已经开始为填报志愿而焦虑。选好学校和专业&#xff0c;直接关系到…

WPF学习(4)--SCICHART学习

一、项目创建过程 1.下载SCICHART插件 2.选中第一个&#xff0c;确保引用中有我们要用的 二、示例代码 1.前端代码 <Window x:Class"SciChart.Examples.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"h…

TSP:常春藤算法IVY求解旅行商问题TSP(可以更改数据),MATLAB代码

一、旅行商问题介绍 二、常春藤算法IVY求解TSP 2.1算法介绍 常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;是Mojtaba Ghasemi 等人于2024年提出智能优化算法。该算法模拟了常春藤植物的生长模式&#xff0c;通过协调有序的种群增长以及常春藤植物的扩散和…

AI大模型真的能让IT工程师薪资再起飞一次吗?

前言 作为传统的IT从业者&#xff0c;开发工程师&#xff0c;测试工程师&#xff0c;数据分析师们&#xff0c;面对如此飞快的技术迭代&#xff0c;是否有了深深的危机感&#xff1f;过去两三年&#xff0c;本来就身处互联网行业寒冬&#xff0c;现在又要面对AI大模型带来的挑…

Unity | Shader基础知识(第十四集:简单效果练习)

目录 前言 一、效果预览 1.弧形边缘光 二、效果制作 1. 制作弧形边缘光 2.弧形边缘光进阶 3.弧形边缘光调节渐变范围 4.边缘光突变 5.同心圆 三、加入世界坐标做效果 1.绘制结界 2.斑马球 3.效果合并 四、作者的碎碎念 前言 有粉丝建议说&#xff0c;让我继续更新…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…

代发考生战报:HCIP H12-725安全变题了

代发考生战报&#xff1a;HCIP H12-725安全变题了&#xff0c;幸好当天找客服办理的包过服务&#xff0c;听同考场的考生说&#xff0c;考试全是新题&#xff0c;只有1-2个是题库上的题&#xff0c;自己考的都考挂了&#xff0c;帮我答题的老师很厉害&#xff0c;很赞&#xff…

Web后端开发的学习

REST风格 GET:查询用户POST:新增用户POT:修改用户DELETE:删除用户 前后端交互统一的响应结果 记录日志 SLf4j 注解&#xff1a; PathVariable&#xff1a;获取路径的参数ResponseBody :方法的返回值直接作为 HTTP 响应的正文返回,将响应的实体类转为json发送给前端Request…

qml自定义组件

不管是component还是分文件编写的一个自定义组件&#xff0c;遵循如下&#xff1a; a:不管哪一级的子对象 都可以直接调根节点下的方法和属性 b:不管哪一级的子对象 调用非根节点的方法和属性&#xff0c;前面要加上该节点的id,即id.方法()或id.属性的形式 import QtQuick 2.…

《Java2实用教程》 期末考试整理

作用域 当前类 当前包 子类 其他包 public √ √ √ √ protected √ √ √ default √ √ private √ 三、问答题&#xff08;每小题4分&#xff0c;共8分&#xff09; 1.类与对象的关系 对象&#xff1a;对象是类的一个实例&#xff0c;有状…

Oracle--数据字典

1.介绍 数据字典是Oracle存储数据库内部信息的地方&#xff0c;描述了数据库内部的运行和管理情况 Oracle数据字典的名称由前缀和后缀组成&#xff0c;使用下划线_连接&#xff1a; dba_&#xff1a;包含数据库实例的所有对象信息v$_&#xff1a;当前实例的动态视图&#xff0…

成龙“参战”暑期档,2024会成为博纳的爆发之年吗?

作为全年最长的档期&#xff0c;暑期档即将迎来观影高峰期&#xff0c;电影市场的竞争已然打响。 根据猫眼数据&#xff0c;目前共有79部影片预计在暑期档上映&#xff0c;且数量仍在持续攀升&#xff0c;这个暑假线下影院势必会非常热闹。 不过电影数量虽多&#xff0c;却依…

RTOS笔记--资源管理

资源管理 资源管理&#xff0c;其实就是前面介绍过的通知方式中的队列信号量互斥量等是如何访问临界资源的&#xff0c;如何做到完全互斥。 在之前举过一个例子&#xff1a;当我们使用全局变量来进行互斥操作时&#xff0c;有可能在改写全局变量时被切换使得不再互斥&#xff0…

一、开发环境安装 Avalonia

1、概述 官网中是这么介绍Avalonia的&#xff0c;Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这…