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

修复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
    }
  }
]

关键修改说明

  1. 保留createdOn字段:在$project步骤中添加createdOn: 1,确保后续分组能正确提取日期
  2. 优化时间范围(可选):将固定起始日期替换为$subtract计算过去30天,无需手动更新日期
  3. 确保日期分组有效:现在第一个$group会按「日期+小时+业务子类型」正确拆分,dailyHourBookings代表单天单小时的预订量,后续$avg就能准确计算多个日期的平均值

内容的提问来源于stack exchange,提问作者Ayush Goel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:57:30