在给定的日期范围内获得免费房间

Getting free rooms on a given date range

我有 3 个这样的模型: 度假村:

let resort = {
   _id: "some id"
}

度假村对应的房间

let room = {
   _id: "some id",
   resort_id: "some resort id", 
   room_status: "Ongoing", //  Ongoing, Available,
   no_of_persons_allowed: 4
}

和预订:

let booking = {
   booking_room_id: "some room id",
   booking_resort_id: "some resort id",
   booking_status: "Booked",// Booked, Ongoing, Completed
   checkIn_date: "some date",
   checkOut_date: "some date"
}

我需要查询满足以下条件的度假村: 假设我有一个有 10 个房间的度假村,每个房间最多可容纳 4 人(在实际情况下,这可能因房间而异),有人想预订 6 人 7 天的房间。因此,我们假设在给定日期已经预订了 8 个房间。 2 个房间是免费的,因此该度假村对客户有效。因为他可以得到 6 人的房间,因为 2 间 8 人的房间是免费的。于是度假村归来。

  1. 查找所有可用且可容纳 6 人以上的房间
  2. 查找第 1 步房间的预订。
  3. 保留那些没有预订的房间
db.room.aggregate([
  {
    $match: {
      no_of_persons_allowed: {
        $gte: 6
      },
      room_status: "Available"
    }
  },
  {
    $lookup: {
      from: "booking",
      localField: "_id",
      // if room_id is unique even in different resort
      foreignField: "booking_room_id",
      as: "isbooking",
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $gt: [
                    "$checkOut_date",
                    ISODate("2022-10-02T00:00:00.000Z")// customer checkin day
                    
                  ]
                },
                {
                  $lt: [
                    "$checkIn_date",
                    {
                      $dateAdd: {
                        startDate: ISODate("2022-10-02T00:00:00.000Z"),
                        // customer checkin day
                        unit: "day",
                        amount: 7
                      }
                    }
                  ]
                },
                {
                  $ne: [
                    "booking_status",
                    "Completed"
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  },
  {
    $match: {
      isbooking: []
    }
  },
  {
    $lookup: {
      from: "resort",
      localField: "resort_id",
      // if room_id is unique even in different resort
      foreignField: "_id",
      as: "resorts"
    }
  }
])

mongoplayground