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

