我目前正在构建一个类似于酒店预订网站的应用程序。
目前正在考虑处理可用性搜索的方法。
我的模型看起来有点像下面的样子:
酒店
_id
名字
描述
star_rating
地址
稍后
隆
然后,我想到有一个可用性集合,如下所示:
可用性
hotel_id (如果可用性是它自己的集合)
日期
room_type
room_max_occupancy
价格
这个房间有一天是空的。
room_type应该是“双”“双”
room_max_occupancy是2,3等.
一个示例查询将是:
6月1日至8日为两人提供的一间客房。
对于“搜索结果”,我需要返回hotel.name、hotel.description、hotel.star_rating。
我正在为上面列出的查询类型寻找最有效的存储这些数据的方法?
可用性收集是属于自己的收藏,还是酒店的子文档?
如果它是自己的集合,我是否应该将lon添加到可用性(以及hotel_id)中,以提高搜索的效率?
发布于 2012-06-10 18:06:31
让我们从查询开始向后工作。你想要的是一张可供约会的房间清单。存储房间是不可行的,因为未来的日期“未预订”,所以您将有一个预订信息的集合。查询看起来应该是:
db.booking.find({date: {$gte: from_date, $lt: to_date}});这可能会给我们一个房间ID的列表。
集合:booking字段:room_id, date
下一个查询将为我们提供一个符合约束条件的Room is列表。类似于:
db.rooms.find({room_type: "Double", room_max_occupancy: 2});除非订好房间的日期,否则我们可以得到可用的情况。如果每家酒店的平均客房数都很高,那么就不值得有可能复制酒店信息的空间,相反,我们应该为每个房间提供酒店Ids。然后,必须聚合一个唯一的酒店列表,以避免重复查询。
集合: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(一些冗余以跳过额外的查询),从中可以获得酒店的显示详细信息
https://stackoverflow.com/questions/10970777
复制相似问题