MongoDB月度交易值聚合查询:生成绘图所需分组统计数据
如何从原始交易明细生成图表所需的聚合数据格式?
嘿,这事儿好办!既然没法从数据库那边拿到聚合好的数据,咱们直接在客户端用代码来处理这些原始交易记录就行。我给你写个JavaScript的实现,逻辑简单易懂,完全能得到你想要的格式:
实现思路
- 先初始化一个符合目标格式的空结构,分别给
credit和debit准备好month数组和data数组 - 遍历所有交易明细,按月份和**交易类型(credit/debit)**来累加对应数值
- 最后整理月份的顺序,确保结果里的月份是按升序排列的
代码实现
// 原始交易数据 const items = [ { month:4, action:'credit', value:1000 }, { month:4, action:'credit', value:1000 }, { month:5, action:'debit', value:2000 }, { month:4, action:'debit', value:2000 }, { month:4, action:'debit', value:500 }, { month:5, action:'credit', value:2000 } ]; // 初始化结果结构 const result = { credit: { month: [], data: [] }, debit: { month: [], data: [] } }; // 先统计每个月份每种交易类型的总金额 const temp = {}; items.forEach(item => { const { month, action, value } = item; if (!temp[month]) { temp[month] = { credit: 0, debit: 0 }; } temp[month][action] += value; }); // 把统计好的数据整理成目标格式 const sortedMonths = Object.keys(temp).map(Number).sort((a, b) => a - b); sortedMonths.forEach(month => { result.credit.month.push(month); result.credit.data.push(temp[month].credit); result.debit.month.push(month); result.debit.data.push(temp[month].debit); }); // 最终结果 console.log([result]);
运行结果
执行上面的代码后,输出的结果就是你想要的:
[ { credit: { month: [4, 5], data: [2000, 2000] }, debit: { month: [4, 5], data: [2500, 2000] } } ]
如果你的技术栈不是JavaScript,也可以用类似的逻辑来实现——核心就是先按月份和交易类型做分组累加,再整理成图表需要的结构就行~
内容的提问来源于stack exchange,提问作者veda
相关产品推荐
相关产品推荐

