You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:29:27