我目前正在使用与酒店预订网站类似的模型构建应用程序。
目前正在考虑处理可用性搜索的方法。
我的模型看起来有点像下面的内容:
饭店
_id
命名
说明
STAR_RATING
解决
LAT
lon
然后我想到了一个像这样的可用性集合:
状况
hotel_id(如果可用性是它自己的收藏品)
日期
room_type
room_max_occupancy
价格
日期将存储一天房间可用 room_type会是“Twin”“Double”之类的东西 room_max_occupancy将是2,3等...
示例查询将是:
6月1日至8日的一个房间,可容纳2人。
对于“搜索结果”,我需要返回hotel.name,hotel.description,hotel.star_rating。
我正在寻找为上面列出的查询类型存储此数据的最有效方法吗?
可用性集合应该是它自己的集合,还是酒店的子文档?
如果它是自己的集合,我应该将lat lon添加到可用性(以及hotel_id)以提高搜索效率吗?
答案 0 :(得分:7)
让我们从查询开始向后工作。您想要的是一系列日期的可用房间列表。将房间存储为未预订的未来日期是不可行的,因此您将拥有预订信息的集合。查询看起来像:
db.booking.find({date: {$gte: from_date, $lt: to_date}});
这可能会为我们提供房间ID列表。
收藏:booking
字段:room_id, date
下一个查询是一个获取适合约束的Room Ids列表的查询。类似的东西:
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(一些冗余以跳过其他查询),您可以从中获取酒店的显示详细信息