Spring操作MongoDB聚合查询:实现投影阶段数组过滤代码
Spring Data MongoDB实现带数组过滤的聚合投影
我来帮你把这段MongoDB原生聚合逻辑转换成Spring Data MongoDB的代码实现,刚好之前做过类似的数组过滤投影需求,直接上干货:
首先对应原生语句的两个核心阶段:$match 匹配指定ID的文档,$project 对两个数组字段做过滤并保留指定字段。下面是完整的Spring代码实现:
1. 导入必要的类
先确保代码里引入这些核心类:
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationExpression; import org.springframework.data.mongodb.core.aggregation.MatchOperation; import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; import org.bson.types.Binary; import org.springframework.data.mongodb.core.query.Criteria; import java.util.Base64;
2. 构建并执行聚合操作
// 1. 构建Match阶段:匹配指定的二进制ID // 对应原生语句里的"_id": { "$binary": "sU7XGDnFYz53KHVhP+sZlQ==", "$type": "03" } Binary targetId = new Binary((byte) 0x03, Base64.getDecoder().decode("sU7XGDnFYz53KHVhP+sZlQ==")); MatchOperation matchStage = Aggregation.match(Criteria.where("_id").is(targetId)); // 2. 构建Projection阶段:对数组字段添加过滤逻辑 // 处理myarray的过滤:保留_id在指定列表中的元素 AggregationExpression filterMyArray = Aggregation.filter("myarray", "item", Criteria.where("item._id").in("JshGyMImCsSceiPqqCCinlAtTrIkwvlx", "0000022211")); // 处理myarray2的过滤(对应你原生语句里未写完的部分,逻辑和myarray一致) AggregationExpression filterMyArray2 = Aggregation.filter("myarray2", "item", Criteria.where("item._id").in("这里替换成你需要的目标ID列表")); // 组装Projection阶段:保留column字段,同时应用数组过滤 ProjectionOperation projectStage = Aggregation.project() .and(filterMyArray).as("myarray") .andInclude("column") // 对应原生语句里的"column":1 .and(filterMyArray2).as("myarray2"); // 3. 组合聚合管道并执行 Aggregation aggregation = Aggregation.newAggregation(matchStage, projectStage); // 替换成你的实体类类型和集合名称 YourEntity result = mongoTemplate.aggregate(aggregation, "mycollection", YourEntity.class).getUniqueMappedResult();
代码对应说明
- Match阶段:用
Binary类精准还原了原生语句里的二进制ID,0x03对应$type: "03",Base64解码后的字节数组对应$binary的值。 - Projection阶段:
Aggregation.filter()完全对应MongoDB原生的$filter语法:第一个参数是输入数组字段名,第二个是迭代变量名(对应as: "item"),第三个是过滤条件(用Criteria.in()实现原生的$in逻辑)。 - 执行聚合:通过
MongoTemplate执行聚合管道,最后映射到你的业务实体类即可。
如果myarray2的过滤条件有特殊规则,只需要修改filterMyArray2里的Criteria条件就行。
内容的提问来源于stack exchange,提问作者abd el fettah Ghazi
相关产品推荐
相关产品推荐

