如何将含投影过滤器的MongoDB原生聚合转换为Spring MongoDB聚合?
将MongoDB原生聚合转换为Spring Data MongoDB实现
下面是对应你提供的原生聚合操作的Spring Data MongoDB代码实现,两种写法供你选择:
写法1:直接构建原生MongoDB Document表达式
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.query.Criteria; import org.bson.Document; import java.util.Arrays; // 替换为你的实体类 public List<DataDocument> filterTargetData() { // 构建$match阶段:筛选_id为1、2的文档 Criteria matchCriteria = Criteria.where("_id").in(1, 2); // 构建聚合管道 Aggregation aggregation = Aggregation.newAggregation( Aggregation.match(matchCriteria), // 构建$project阶段,实现数组过滤逻辑 Aggregation.project() .and(ctx -> new Document("$filter", new Document("input", "$datas") .append("as", "item") .append("cond", new Document("$or", Arrays.asList( new Document("$eq", Arrays.asList("$$item.name", "data1")), new Document("$eq", Arrays.asList("$$item.name", "data2")) )) ) ).as("datas") ); // 执行聚合查询并返回结果 AggregationResults<DataDocument> results = mongoTemplate.aggregate( aggregation, "data", DataDocument.class ); return results.getMappedResults(); }
写法2:使用Spring Data MongoDB封装的API(更简洁)
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; import org.springframework.data.mongodb.core.query.Criteria; import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; import static org.springframework.data.mongodb.core.aggregation.Expressions.*; // 替换为你的实体类 public List<DataDocument> filterTargetData() { // $match阶段 Criteria matchCriteria = Criteria.where("_id").in(1, 2); // $project阶段:用Spring封装API构建数组过滤 ProjectionOperation projection = project() .and(filter("datas") .as("item") .by(or( eq(field("item.name"), "data1"), eq(field("item.name"), "data2") )) ).as("datas"); // 执行聚合 Aggregation aggregation = newAggregation(match(matchCriteria), projection); AggregationResults<DataDocument> results = mongoTemplate.aggregate( aggregation, "data", DataDocument.class ); return results.getMappedResults(); }
关键逻辑对应说明
- $match阶段:两种写法都通过
Criteria.where("_id").in(1, 2)实现原生聚合的$match条件,精准筛选指定ID的文档。 - $project中的$filter逻辑:
- 写法1直接用
Document复刻原生聚合的$filter结构,逻辑完全对齐原生代码; - 写法2利用Spring提供的
filter()、or()、eq()等封装方法,无需手写原生MongoDB语法,可读性更强。
- 写法1直接用
内容的提问来源于stack exchange,提问作者thibault Chevet
相关产品推荐
相关产品推荐

