monogoTemplate 将 JSON{key1: 1, key2:2, key3:[{},{}{}]} 中key3 中的数组元素提取出来作为新的文档

问题描述

monogoTemplate 将 JSON{key1: 1, key2:2, key3:{},{}{}} 中key3 中的数组元素提取出来作为新的文档

java 复制代码
// 创建聚合操作
Aggregation agg = Aggregation.newAggregation(
    Aggregation.match(Criteria.where("YOUR_FILTER_FIELD").is(YOUR_VALUE)), // 过滤条件
    Aggregation.unwind("key3"), // 展开key3数组
    Aggregation.replaceRoot("$key3") // 设置key3数组中的每个对象为新的文档根
);
// 执行聚合查询
AggregationResults<Class_Name> results = mongoTemplate.aggregate(agg, "COLLECTION_NAME", Class_Name.class);
// 获取查询结果
List<Class_Name> extractedDocuments = results.getMappedResults();

将key3 中的数组元素提取出来作为新的文档后继续筛选

JSON{key1: 1, key2:2, key3:{createTime: 13位时间戳},{}{}}

java 复制代码
 Aggregation aggregation;
 List<AggregationOperation> operations = new ArrayList<>();
 operations.add(Aggregation.unwind("key3"));
 // 注意下面这条语句
 operations.add(Aggregation.replaceRoot("key3"));
 if (qo.getStartTime() != null) {
 	 // 此时key3已经成为新的文档的根字段,注意这个查询条件直接用createTime,而不是key3.createTime
     operations.add(Aggregation.match(Criteria.where("createTime").gte(qo.getStartTime())));
 }
 if (qo.getEndTime() != null) {
     operations.add(Aggregation.match(Criteria.where("createTime").lte(qo.getEndTime())));
 }

增加分页

java 复制代码
int pageNo = 1; // 查询第一页
int pageSize = 10; // 假设每页显示10个文档
Aggregation agg = Aggregation.newAggregation(
    Aggregation.match(Criteria.where("YOUR_FILTER_FIELD").is(YOUR_VALUE)), // 过滤条件
    Aggregation.unwind("key3"), // 展开key3数组
    Aggregation.replaceRoot("$key3"), // 设置key3数组中的每个对象为新的文档根
    Aggregation.skip((pageNo - 1) * pageSize), // 跳过之前页面的文档
    Aggregation.limit(pageSize) // 限制本页面返回的文档数量
);
// 执行聚合查询
AggregationResults<Class_Name> results = mongoTemplate.aggregate(agg, "COLLECTION_NAME", Class_Name.class);
// 获取分页后的查询结果
List<Class_Name> pagedDocuments = results.getMappedResults();

动态添加查询条件

java 复制代码
List<AggregationOperation> operations = new ArrayList<>();
// 添加基础条件
operations.add(Aggregation.match(Criteria.where("YOUR_FILTER_FIELD").is(YOUR_VALUE)));
operations.add(Aggregation.unwind("key3"));
operations.add(Aggregation.replaceRoot("$key3"));
// 根据需要添加更多的条件
if (需要添加额外的条件) {
    operations.add(Aggregation.match(额外的Criteria));
}
// 添加分页
int pageNo= 1; // 页码
int pageSize = 10; // 每页数量
operations.add(Aggregation.skip((pageNumber - 1) * pageSize));
operations.add(Aggregation.limit(pageSize));
// 通过列表创建聚合对象
Aggregation agg = Aggregation.newAggregation(operations);
// 执行聚合查询
AggregationResults<Class_Name> results = mongoTemplate.aggregate(agg, "COLLECTION_NAME", Class_Name.class);
// 获取结果
List<Class_Name> pagedDocuments = results.getMappedResults();
相关推荐
我不会起名字32211 小时前
req.Seqs[len-1]:空切片防御缺口与 RPC 二次校验
后端·mongodb·go·即时通讯·im·故障排查
瑞雪兆丰年兮1 天前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
我不会起名字3222 天前
seq 空洞排查:Mongo 的 51 只是预留上界,Redis CURR 才是已消耗边界
redis·后端·mongodb·go·即时通讯·im·故障排查
这个昵称不容易3 天前
考试报名系统的设计与实现(SpringBoot + MySQL + Vue 三角色平台)
java·springboot·毕设
希和20273 天前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
希和20273 天前
51 单片机 LED 流水灯:从直接法到循环法(江科大课程笔记)
笔记·单片机·mongodb
欢醉3 天前
SpringBoot中@Async异步透传问题内部分享
springboot·springcloud·asynctask异步更新
我不会起名字3224 天前
消费回调固定 return nil:错误传播与 Kafka 位点提交的区别
后端·mongodb·kafka·go·im·故障排查
小南家的青蛙4 天前
基于Spring Boot 2.x开发的微服务访问Redis的方案
redis·springboot
这个昵称不容易4 天前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设