如何在Java中使用MongoDB Aggregation GroupOperation实现条件分组统计查询
MongoDB 条件分组聚合Java实现方案
1. Spring Data MongoDB 实现(最常用)
该方案使用Spring Data MongoDB提供的Aggregation、GroupOperation相关API实现,和你给出的原生查询逻辑完全对应:
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.GroupOperation; import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.when; import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf; // 构造分组操作 GroupOperation groupOperation = Aggregation.group("categoryCode", "categoryName") .sum( // 对应原生$cond条件判断 when(valueOf("cat_type").equalToValue("A")) .then(1) .otherwise(0) ) .as("cat_count"); // 统计结果别名对应原生的cat_count
逻辑对应说明
Aggregation.group("categoryCode", "categoryName")对应原生$group的_id部分,会自动按照两个字段组合分组- 嵌套的
when...then...otherwise结构对应原生的$cond+$eq组合逻辑,判断cat_type等于"A"时返回1,否则返回0,累加后即为符合条件的记录数
后续可以将该GroupOperation加入聚合管道,通过mongoTemplate.aggregate()方法执行查询即可。
2. MongoDB官方原生Java驱动实现
如果你没有使用Spring框架,直接使用官方Java驱动可以参考如下写法:
import com.mongodb.client.model.Accumulators; import com.mongodb.client.model.Aggregates; import org.bson.Document; // 构造分组聚合阶段 Document groupId = new Document("categoryCode", "$categoryCode") .append("categoryName", "$categoryName"); Document condExpr = Document.parse("{$cond: [{$eq: ['$cat_type', 'A']}, 1, 0]}"); var groupStage = Aggregates.group(groupId, Accumulators.sum("cat_count", condExpr));
内容的提问来源于stack exchange,提问作者prabhakar srivastava
相关产品推荐
相关产品推荐

