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

如何将含投影过滤器的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语法,可读性更强。

内容的提问来源于stack exchange,提问作者thibault Chevet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:36:33