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

如何在Java中计算MongoDB集合指定字段的总和?

Java MongoDB 计算集合value字段总和的正确实现

问题分析

你当前代码存在两个关键问题:

  1. Accumulators.sum参数顺序错误:第一个参数是聚合结果的字段名,第二个才是要求和的目标字段(需用"$value"指代)
  2. 未指定聚合查询的返回类型,驱动默认会映射到集合对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:11:51