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

