如何在Java中计算MongoDB集合指定字段的总和?
Java MongoDB 计算集合value字段总和的正确实现
问题分析
你当前代码存在两个关键问题:
Accumulators.sum参数顺序错误:第一个参数是聚合结果的字段名,第二个才是要求和的目标字段(需用"$value"指代)- 未指定聚合查询的返回类型,驱动默认会映射到集合对应的
TestObj类,但聚合结果结构和TestObj不匹配,导致无法正确获取求和值
解决方案1:用Document接收聚合结果
直接使用MongoDB的Document类接收结果,手动提取求和值:
import org.bson.Document; import com.mongodb.client.AggregateIterable; import static com.mongodb.client.model.Aggregates.group; import static com.mongodb.client.model.Accumulators.sum; public long getTotalValue(){ // 修正sum参数顺序,指定结果字段名和目标聚合字段 AggregateIterable<Document> result = this.getCollection().aggregate( List.of( group(null, sum("totalValue", "$value")) ) ); // 获取唯一的聚合结果文档 Document doc = result.first(); if (doc != null) { return doc.getLong("totalValue"); } // 集合为空时返回0 return 0L; }
解决方案2:用自定义DTO接收聚合结果
如果想用对象优雅接收,可定义一个简单的结果类:
// 自定义聚合结果DTO public class SumResult { private long totalValue; // 必须保留无参构造器,MongoDB映射需要 public SumResult() {} public long getTotalValue() { return totalValue; } public void setTotalValue(long totalValue) { this.totalValue = totalValue; } }
然后在聚合时指定返回类型为SumResult:
import com.mongodb.client.AggregateIterable; import static com.mongodb.client.model.Aggregates.group; import static com.mongodb.client.model.Accumulators.sum; public long getTotalValue(){ AggregateIterable<SumResult> result = this.getCollection().aggregate( List.of( group(null, sum("totalValue", "$value")) ), SumResult.class // 指定返回类型为自定义DTO ); SumResult sumResult = result.first(); return sumResult != null ? sumResult.getTotalValue() : 0L; }
关键说明
group(null)表示对整个集合的所有文档进行全局分组聚合Accumulators.sum("totalValue", "$value")意为将所有文档的value字段求和,结果存入totalValue字段- 必须显式指定聚合查询的返回类型,否则驱动会默认用集合的实体类(TestObj)映射,导致结构不匹配
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

