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

MongoDB .NET Driver聚合查询:按月统计收支分组求和

MongoDB .NET Driver 月度收支统计实现方案

1. 定义结果接收类

先创建一个类用于存储分组后的统计结果:

public class MonthlySummary
{
    public string Type { get; set; }
    public double TotalAmount { get; set; }
}

2. 完整聚合管道实现

在你已有的Match和Project阶段后,添加Group阶段完成分组求和:

// 保留你原有的过滤条件与投影定义
var monthlyNonIncomefilter = filterBuilder.Gte(x => x.Date, fromDate) &
    filterBuilder.Lte(x => x.Date, toDate);

var priceProjection = projectionBuilder.Expression(u => new
{
    Price = u.Price,
    Type = u.Category == "Income" ? "Income" : "MonthlySpent"
});

// 执行完整聚合操作
var monthlySummary = await transactionCollection.Aggregate()
    .Match(monthlyNonIncomefilter)
    .Project(priceProjection)
    .Group(
        groupingKey => groupingKey.Type, // 按Type字段分组
        groupResult => new MonthlySummary
        {
            Type = groupResult.Key,
            TotalAmount = groupResult.Sum(item => item.Price) // 计算每组金额总和
        }
    )
    .ToListAsync();

3. 转换为更易用的格式(可选)

如果希望直接得到包含收入、支出的结构化对象,可将结果列表转换为字典或自定义对象:

var summaryDict = monthlySummary.ToDictionary(s => s.Type, s => s.TotalAmount);

var finalSummary = new 
{
    Income = summaryDict.TryGetValue("Income", out var income) ? income : 0.0,
    MonthlySpent = summaryDict.TryGetValue("MonthlySpent", out var spent) ? spent : 0.0
};

// 使用示例
Console.WriteLine($"月度收入: {finalSummary.Income}, 月度支出: {finalSummary.MonthlySpent}");

关键说明

  • Group阶段通过Type字段分组,利用Sum累加每组的Price值
  • 若指定日期范围内无收入/支出记录,TryGetValue会返回0以避免空引用问题
  • 无需修改原有过滤与投影逻辑,仅新增分组聚合步骤即可完成需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:50:58