当前位置: 首页 > 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);
        //多层级查询条件
        // 展开第一层级数组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();

相关文章:

  • 微信小程序修改标题
  • 力扣(2024.06.17)
  • 【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——中
  • c++ 智能指针使用注意事项及解决方案
  • 教学资源共享平台的设计
  • 富瀚微FH8322 ISP图像调试—BLC校正
  • XXE漏洞详解:从基础到防御
  • 8.12 矢量图层面要素单一符号使用一(简单填充)
  • python基础面试器(其一)
  • 为什么要学习这么多“没用”的知识
  • 持续总结中!2024年面试必问 20 道设计模式面试题(一)
  • 倩女幽魂手游攻略:云手机自动搬砖辅助教程!
  • Python学习从0开始——Kaggle深度学习002
  • Java多线程设计模式之不可变对象(Immutable Object)模式
  • [深度学习]基于C++和onnxruntime部署yolov10的onnx模型
  • Swift开发——元组
  • 一篇搞定Spring,IOC容器,Bean管理,3.AOP底层原理和实现(收下吧,真的很详细)
  • Linux之逻辑控制符
  • 【Linux】使用 iptables 验证访问HDFS 所使用到的端口
  • Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发
  • 特朗普考虑任命副幕僚长米勒任国安顾问,曾策划驱逐移民行动
  • 金科股份:因信披违规,公司及董事长、总裁、财务负责人等收到行政监管措施决定书
  • 长三角铁路今日预计发送旅客420万人次,有望创单日客发量新高
  • 澎湃读报丨解放日报8个版聚焦:牢记嘱托,砥砺奋进
  • 海南机场拟超23亿元收购美兰空港控股权,进一步聚焦机场主业