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

基于MongoDB Java Driver 4.11.1的金额求和与日期分组聚合示例求助

MongoDB Java Driver 4.11.1 金额求和与日期聚合示例

一、所有数据金额求和

针对你的数据模型,要对所有文档的amount字段求和,只需调整官方示例中的累加器目标字段即可。官方示例用Accumulators.sum("count", 1)实现计数,我们将第二个参数改为"$amount",同时分组键设为null表示全局聚合:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Accumulators;
import com.mongodb.client.model.Aggregates;
import org.bson.Document;
import java.util.Arrays;

public class TotalAmountSum {
    public static void main(String[] args) {
        try (var mongoClient = MongoClients.create()) {
            MongoCollection<Document> collection = mongoClient.getDatabase("your_db_name").getCollection("your_collection_name");
            
            var aggregationPipeline = Arrays.asList(
                Aggregates.group(null, Accumulators.sum("total_amount", "$amount"))
            );
            
            collection.aggregate(aggregationPipeline).forEach(result -> 
                System.out.println("总金额:" + result.get("total_amount"))
            );
        }
    }
}

这段代码会计算集合中所有文档的amount总和,结果存储在total_amount字段中。

二、按月份/年份分组聚合

日期分组的核心是在分组键中提取日期的年、月信息,而非使用Accumulators。你需要用MongoDB的日期表达式(如$year、$month)从booked字段中提取对应部分,再以此作为分组依据,结合金额求和。

1. 按年份分组求和

var pipeline = Arrays.asList(
    Aggregates.group(
        new Document("year", new Document("$year", "$booked")),
        Accumulators.sum("yearly_total", "$amount")
    )
);

分组键为从booked提取的年份,每个年份对应一组,计算该年的金额总和。

2. 按月份分组求和

var pipeline = Arrays.asList(
    Aggregates.group(
        new Document("month", new Document("$month", "$booked")),
        Accumulators.sum("monthly_total", "$amount")
    )
);

提取booked字段中的月份作为分组键,统计每个月份的金额总和。

3. 按年份+月份分组求和

如果需要同时按年和月分组,只需在分组键中同时包含年和月信息:

var pipeline = Arrays.asList(
    Aggregates.group(
        new Document("year", new Document("$year", "$booked"))
                .append("month", new Document("$month", "$booked")),
        Accumulators.sum("year_month_total", "$amount")
    )
);

每个“年份-月份”组合作为独立分组,输出对应周期的金额总和。

4. 输出格式化的年月字符串

如果希望分组结果的日期格式更直观(如2023-10),可以使用$dateToString表达式:

var pipeline = Arrays.asList(
    Aggregates.group(
        new Document("year_month", new Document("$dateToString", 
            new Document("format", "%Y-%m").append("date", "$booked"))),
        Accumulators.sum("total_amount", "$amount")
    )
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:53:12