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
相关产品推荐
相关产品推荐

