修复MongoDB Compass聚合管道:同星期几每小时预订量平均值计算
修复MongoDB聚合管道:计算指定星期几的每小时预订量平均值
问题原因
原管道的核心问题是**$project阶段丢失了createdOn字段**,导致后续按日期分组时无法正确拆分每天的数据:
- 在
$project步骤中仅保留了hour和businessSubType,删除了createdOn - 后续第一个
$group里的date字段依赖$createdOn,但该字段已不存在,所有文档的date值为null - 这使得第一个分组实际上是把所有同小时、同业务子类型的预订合并为一组,
dailyHourBookings直接等于总预订数 - 最终计算平均值时,
$avg作用在单一数值上,结果自然和总预订数完全相同
修复后的聚合管道
[ { $addFields: { currentDayOfWeek: { $dayOfWeek: new Date() } } }, { $match: { createdOn: { $gte: { $subtract: [new Date(), 30 * 24 * 60 * 60 * 1000] }, // 自动取过去30天,替代固定日期 $lt: new Date() }, $expr: { $eq: [{ $dayOfWeek: "$createdOn" }, "$currentDayOfWeek"] } } }, { $project: { hour: { $hour: "$createdOn" }, businessSubType: 1, createdOn: 1 // 保留createdOn字段,用于后续按日期分组 } }, { $group: { _id: { hour: "$hour", businessSubType: "$businessSubType", date: { $dateToString: { format: "%Y-%m-%d", date: "$createdOn" } } }, dailyHourBookings: { $sum: 1 } } }, { $group: { _id: { businessSubType: "$_id.businessSubType", hour: "$_id.hour" }, monthlyAverage: { $avg: "$dailyHourBookings" }, totalBookings: { $sum: "$dailyHourBookings" } } }, { $project: { _id: 0, hour: "$_id.hour", businessSubType: "$_id.businessSubType", monthlyAverage: 1, totalBookings: 1 } }, { $sort: { hour: 1 } } ]
关键修改说明
- 保留
createdOn字段:在$project步骤中添加createdOn: 1,确保后续分组能正确提取日期 - 优化时间范围(可选):将固定起始日期替换为
$subtract计算过去30天,无需手动更新日期 - 确保日期分组有效:现在第一个
$group会按「日期+小时+业务子类型」正确拆分,dailyHourBookings代表单天单小时的预订量,后续$avg就能准确计算多个日期的平均值
内容的提问来源于stack exchange,提问作者Ayush Goel
相关产品推荐
相关产品推荐

