MongoDB Compass 中的复杂聚合查询

问题描述 投票:0回答:1

MongoDB Compass 中的聚合管道。

管道将从createdOn列中获取今天的dayOfWeek。 然后它将计算上个月每个工作日每个businessSubType每小时的预订数量。

例如。 今天是 29 号星期五。 管道应获取过去 4/5 周内每个星期五每个业务子类型每小时的预订计数。 即22号星期五、15号星期五、8号星期五和1号星期五。

完成此操作后,管道将获取过去四个星期五每小时的平均值,并将其存储在某个地方。

所以输出看起来像 小时 - 过去 4 个星期五的平均预订小时数 - 商务子类型 1 小时 - 0 次预订 - 航班。 2 小时 - 3 次预订 - 酒店

简而言之,我希望获得过去一个月同一 DayOfWeek 中每个businessSubType 每小时的平均预订量。

这是我正在使用的代码,但它给出了相同的平均值和相同的总预订数。

`[
  {
    $addFields: {
      currentDayOfWeek: { $dayOfWeek: new Date() }
    }
  },
  {
    $match: {
      createdOn: {
        $gte: ISODate("2023-08-01T00:00:00.000Z"),
        $lt: new Date(),
      },
      $expr: {
        $eq: [
          { $dayOfWeek: "$createdOn" },
          "$currentDayOfWeek"
        ]
      }
    }
  },
  {
    $project: {
      hour: { $hour: "$createdOn" },
      businessSubType: 1,
    }
  },
  {
    $group: {
      _id: {
        hour: "$hour",
        businessSubType: "$businessSubType",
      },
      totalBookings: { $sum: 1 }
    }
  },
  {
    $group: {
      _id: {
        businessSubType: "$_id.businessSubType",
        hour: "$_id.hour",
      },
      monthlyAverage: { $avg: "$totalBookings" },
      totalBookings: { $sum: "$totalBookings" }
    }
  },
  {
    $project: {
      _id: 0,
      hour: "$_id.hour",
      businessSubType: "$_id.businessSubType",
      monthlyAverage: 1,
      totalBookings: 1
    }
  },
  {
    $sort: {
      hour: 1
    }
  }
]`

你能帮我修复这个管道吗? 非常感谢。

database mongodb nosql aggregation-framework data-engineering
1个回答
0
投票

根据您的代码,计算日期范围存在问题:

这是更新后的代码,其中突出显示了

added code
modified
removed
一个

[
  { $addFields: { currentDayOfWeek: { $dayOfWeek: new Date() } } },

  {
    $match: {
      createdOn: {
        $gte: ISODate("2023-08-01T00:00:00.000Z"),
        $lt: new Date()
      },
      $expr: {
        $eq: [
          { $dayOfWeek: "$createdOn" },
          "$currentDayOfWeek"
        ]
      }
    }
  },

  {
    $project: {
      hour: { $hour: "$createdOn" },
      businessSubType: 1,
      week: { $week: "$createdOn" }  // <-- ADDED: Extracting the week of the year
    }
  },

  {
    $group: {
      _id: {
        week: "$week",  // <-- ADDED: Grouping by week as well
        hour: "$hour",
        businessSubType: "$businessSubType"
      },
      bookingsForTheHour: { $sum: 1 }  // <-- CHANGED: Renamed from "totalBookings" to "bookingsForTheHour" for clarity of variable what it's doing
    }
  },

  {
    $group: {
      _id: {
        hour: "$_id.hour",
        businessSubType: "$_id.businessSubType"
      },
      monthlyAverage: { $avg: "$bookingsForTheHour" }  // <-- CHANGED: Now taking average of the bookings for the hour
    }
  },

  {
    $project: {
      _id: 0,
      hour: "$_id.hour",
      businessSubType: "$_id.businessSubType",
      monthlyAverage: 1  // <-- REMOVED: The totalBookings field, since it's not required
    }
  },

  {
    $sort: {
      businessSubType: 1,  // <-- ADDED: Sorting by businessSubType as well for better organization of result
      hour: 1
    }
  }
]

试试这个。

© www.soinside.com 2019 - 2024. All rights reserved.