MongoDB Schema酒店预订/客房供应情况

Ale*_*lex 3 schema mongodb nosql

我目前正在为酒店预订网站建立一个类似模型的应用程序.

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

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

酒店
_id
名称
说明
star_rating
地址
lat
lon

然后,我想到了一个可用性集合,如下所示:

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

date会存储一天房间可用
room_type就像"Twin""Double"
room_max_occupancy将是2,3等等...

一个示例查询将是:
6月1日至8日的一个房间,可容纳2人.

对于"搜索结果",我需要返回hotel.name,hotel.description,hotel.star_rating.

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

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

如果它是自己的集合,我应该将lat lon添加到可用性(以及hotel_id)以提高搜索效率吗?

Elv*_*uza 7

让我们从查询开始向后工作.您想要的是一系列日期的可用房间列表.将房间存储为未预订的未来日期是不可行的,因此您将拥有预订信息的集合.查询看起来像:

db.booking.find({date: {$gte: from_date, $lt: to_date}});
Run Code Online (Sandbox Code Playgroud)

这可能会为我们提供房间ID列表.

收集:booking 字段:room_id, date

下一个查询是一个获取符合约束的Room Ids列表的查询.就像是:

db.rooms.find({room_type: "Double", room_max_occupancy: 2});
Run Code Online (Sandbox Code Playgroud)

除了预订房间的日期,我们可以获得可用性状态.如果每间酒店的平均房间数量很高,那么它不值得用于可能复制酒店信息的空间,相反,我们应该为每个房间提供酒店ID.然后,您必须汇总一个唯一的酒店列表,以避免重复查询

收集:rooms字段:room_type, room_max_occupancy, price, hotel_id

最后的查询是获取酒店信息:

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

收集: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}});
Run Code Online (Sandbox Code Playgroud)

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

  • @Alex我想建议将来添加"可用日期"不是一个好的解决方案.使用反逻辑.查询以获取与所请求日期相匹配的所有预订,然后将地图从该地区/城市的所有酒店列表中删除,然后您将获得当时可用的酒店/房间列表.通过这种方式,客人可以随心所欲地搜索未来.如果没有为一组日期返回任何属性,则所有属性都可用.在预订时运行快速可用性检查,以确保自首次搜索后没有预订. (2认同)