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

Spring Aggregations如何实现多条件过滤操作

对应多条件$filter逻辑的Spring Data MongoDB实现方案

直接参考以下代码实现即可,完全匹配你给出的MongoDB原生聚合逻辑:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.aggregation.BooleanOperators.And;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq;
import org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter;

// 1. 构造$match阶段
Criteria matchCriteria = Criteria.where("metadata.type").is("UNPAID")
        .and("metadata.syncStatus").is("OK")
        .and("metadata.paymentStatus").is("UNKNOWN")
        .and("planName").is("myplan")
        .and("environment").is("PREPROD")
        .and("country").is("sl");
MatchOperation matchStage = Aggregation.match(matchCriteria);

// 2. 构造$filter的多条件判断逻辑
AggregationExpression eqType = Eq.valueOf("$$metadata.type").equalToValue("UNPAID");
AggregationExpression eqSyncStatus = Eq.valueOf("$$metadata.syncStatus").equalToValue("OK");
AggregationExpression eqPaymentStatus = Eq.valueOf("$$metadata.paymentStatus").equalToValue("UNKNOWN");
// 组合三个等值条件为and逻辑
AggregationExpression filterCond = And.and(eqType).and(eqSyncStatus).and(eqPaymentStatus);

// 3. 构造数组过滤规则
AggregationExpression metadataFilter = Filter.filter("metadata")
        .as("metadata")
        .by(filterCond);

// 4. 构造$project阶段
ProjectionOperation projectStage = Aggregation.project("planName", "phoneNumber", "time")
        .and(metadataFilter).as("metadata");

// 5. 执行聚合查询
Aggregation aggregation = Aggregation.newAggregation(matchStage, projectStage);
// 此处TestVO为你自定义的结果映射类,"test"为对应集合名
AggregationResults<TestVO> results = mongoTemplate.aggregate(aggregation, "test", TestVO.class);
List<TestVO> resultList = results.getMappedResults();

低版本Spring Data MongoDB兼容写法

如果你使用的版本不支持上述流畅API,可以手动构造DBObject实现相同逻辑:

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

// $match阶段构造逻辑和上面一致,此处省略
// 手动构造$filter对象
DBObject filterParams = new BasicDBObject();
filterParams.put("input", "$metadata");
filterParams.put("as", "metadata");
// 构造多条件列表
List<DBObject> condItems = new ArrayList<>();
condItems.add(new BasicDBObject("$eq", Arrays.asList("$$metadata.type", "UNPAID")));
condItems.add(new BasicDBObject("$eq", Arrays.asList("$$metadata.syncStatus", "OK")));
condItems.add(new BasicDBObject("$eq", Arrays.asList("$$metadata.paymentStatus", "UNKNOWN")));
filterParams.put("cond", new BasicDBObject("$and", condItems));

// 构造project阶段
ProjectionOperation projectStage = Aggregation.project("planName", "phoneNumber", "time")
        .and(new BasicDBObject("$filter", filterParams)).as("metadata");
// 后续执行逻辑和上面一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:36:03