4

我目前正在构建一个与酒店预订网站具有类似模型的应用程序。

目前正在考虑处理可用性搜索的方法。

我的模型看起来有点像下面:

酒店
_id
名称
描述
star_rating
地址
lat
lon

然后我想到有一个像这样的可用性集合:

可用性
hotel_id(如果可用性是它自己的集合)
date
room_type
room_max_occupancy
price

date 将存储房间可用的一天
room_type 将是“Twin” “Double”<br> room_max_occupancy 将是 2、3 等...

一个示例查询是:
6 月 1 日至 8 日入住的房间,可供 2 人入住。

对于“搜索结果”,我需要返回hotel.name、hotel.description、hotel.star_rating。

我正在寻找为上面列出的查询类型存储此数据的最有效方法?

可用性集合应该是它自己的集合还是 Hotel 的子文档?

如果它是自己的集合,我是否应该将纬度添加到可用性中(连同hotel_id)以提高搜索效率?

4

1 回答 1

10

让我们从查询开始向后工作。您想要的是一系列日期的可用房间列表。将房间存储为未来日期的“未预订”是不可行的,因此您将收集预订信息。查询如下所示:

db.booking.find({date: {$gte: from_date, $lt: to_date}});

这可能会给我们一个房间 ID 列表。

集合:booking 领域:room_id, date

下一个查询是为我们提供符合约束条件的房间 ID 列表。就像是:

db.rooms.find({room_type: "Double", room_max_occupancy: 2});

除非房间已被预订的日期,我们可以得到可用性状态。如果每家酒店的平均房间数量很高,则不值得用于潜在地复制酒店信息的空间,相反,我们应该为每个房间提供酒店 ID。然后,您必须汇总唯一的酒店列表以避免重复查询

集合:rooms领域:room_type, room_max_occupancy, price, hotel_id

最后一个查询用于获取酒店信息:

db.hotels.find({id: <ID>}, {'name': 1, 'description': 1, 'star_rating': 1});

集合:hotels领域:name, description, star_rating, address, lat, lon

如果您确实需要直接访问可用性信息,则必须确定允许预订的日期限制(比如未来 6 个月)。每天,必须运行一个脚本来向数据库添加新的一天(空白)可用性信息。您可以将预订集合修改为:

集合:booking字段:(room_id, date, is_available, hotel_id以及保存预订过程详细信息的字段)

您的查询现在应该有一个额外的约束:

db.booking.find({is_available: true, date: {$gte: from_date, $lt: to_date}});

您将可以访问房间 ID 和酒店 ID(一些冗余以跳过其他查询),您可以从中获取酒店的显示详细信息

于 2012-06-10T18:06:31.613 回答