如何在Mongoose中按name、provider分组后按月分组求月度平均值
实现方案
你可以通过Mongoose的聚合管道分步骤完成需求,为了避免不同年份的同月数据混淆,建议同时提取年份和月份作为分组维度:
完整聚合查询代码
const result = await 你的集合Model.aggregate([ // 第一步:按provider、name、年月分组,计算单月totalSalesUsd平均值 { $group: { _id: { provider: "$provider", name: "$name", year: { $year: "$createdAt" }, month: { $month: "$createdAt" } }, avgSalesUsd: { $avg: "$totalSalesUsd" } } }, // 可选第二步:如果需要按name+provider为根分组,把所有月份的统计结果聚合到同一个条目下 { $group: { _id: { provider: "$_id.provider", name: "$_id.name" }, monthlyStatistics: { $push: { year: "$_id.year", month: "$_id.month", avgSalesUsd: "$avgSalesUsd" } } } }, // 可选:调整输出字段格式,简化结构 { $project: { _id: 0, provider: "$_id.provider", name: "$_id.name", monthlyStatistics: 1 } } ])
结果说明
- 如果不需要按name+provider聚合为同一对象,删掉第二个$group阶段即可,输出的每条结果直接对应一个name+provider+年月维度的平均销售额
- 如果需要统计指定时间范围的数据,可以在聚合最开头加$match阶段过滤
createdAt的时间范围 - Mongoose的聚合语法和原生MongoDB完全兼容,直接调用对应集合模型的aggregate方法即可执行
内容的提问来源于stack exchange,提问作者aqeel raza
相关产品推荐
相关产品推荐

