MongoDB 多层级查询

2024-06-11 23:20
文章标签 查询 mongodb 层级

本文主要是介绍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 多层级查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052536

相关文章

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

MySQL基础(7)- 多表查询

目录 一、笛卡尔积的错误与正确的多表查询 1.出现笛卡尔积错误 2.正确的多表查询:需要有连接条件 3.查询多个表中都存在的字段 4.SELECT和WHERE中使用表的别名 二、等值连接vs非等值连接、自连接vs非自连接 1.等值连接  vs  非等值连接 2.自连接  vs  非自连接 3.内连接  vs  外连接 4.UNION  和 UNION ALL的使用 5.7种J

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs