在给定的日期范围内获得免费房间
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 人的房间是免费的。于是度假村归来。
- 查找所有可用且可容纳 6 人以上的房间
- 查找第 1 步房间的预订。
- 保留那些没有预订的房间
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"
}
}
])
我有 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 人的房间是免费的。于是度假村归来。
- 查找所有可用且可容纳 6 人以上的房间
- 查找第 1 步房间的预订。
- 保留那些没有预订的房间
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"
}
}
])