我正在用nodejs构建一个房间预订系统。目前我有hotels,rooms和bookings作为收藏。
rooms被引用hotels和bookings被引用rooms。
预订.js
const bookingSchema = new mongoose.Schema({
room: {
type: mongoose.Schema.Types.ObjectId,
ref: 'rooms'
},
start: Date,
end: Date
});
Run Code Online (Sandbox Code Playgroud)
房间.js
const roomSchema = new mongoose.Schema({
roomid: String,
hotel: {
type: mongoose.Schema.Types.ObjectId,
ref: 'hotel_managers'
},
type: String,
price: Number,
capacity: Number,
facilities: [String],
amenities: [String],
img: [String]
});
Run Code Online (Sandbox Code Playgroud)
酒店.js
const hotel_manager_schema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
},
hotelname: {
type: String,
required: true
},
role: {
type: String,
default: 'manager'
},
location: {
type: String,
required: true
},
img:{
type: String,
required: true
}
})
Run Code Online (Sandbox Code Playgroud)
注意:这是一个服务提供商端系统,因此酒店基本上是拥有凭据的酒店经理。
我想要实现的是,当用户发送给定日期范围的查询时,我想返回所有可用的酒店以及在查询日期范围内没有任何预订的酒店房间。
我是 MongoDB 的新手,所以任何关于如何做我想做的事情的提示或建议都会有很大的帮助。
根据您的模式模型架构,您可以执行以下操作;我们想要列出所有可用的酒店以及在给定日期范围内没有任何预订的酒店的房间。
因此,为了实现这一目标,我们将获取与查询中提供的日期范围重叠的所有预订,并返回它们的房间 ID;之后,我们获取所有房间,排除从预订返回的房间 ID 数组。
const bookings = await Booking
.find({
$or: [
{ start: { $gte: from_date, $lte: to_date } },
{
end: { $gte: from_date, $lte: to_date }
},
{
$and: [{ start: { $lte: from_date } }, { end: { $gte: to_date } }]
},
],
})
.select('room');
Run Code Online (Sandbox Code Playgroud)
const roomIds = bookings.map(b => b.room);
const availableRooms = await Room.find({ _id: { $nin: roomIds } })
Run Code Online (Sandbox Code Playgroud)
您可以通过填充 Rooms 酒店属性字段来提取酒店的数据:
const availableRooms = await Room
.find({ _id: { $nin: roomIds } })
.populate('hotel', 'username password hotelname role location img')
Run Code Online (Sandbox Code Playgroud)
我希望这对你有用。