Mongodb 如何在其他集合中搜索和查找符合条件的父文档
我用的是meteor和mongo数据库 我有两个一对多结构的集合 酒店:Mongodb 如何在其他集合中搜索和查找符合条件的父文档,mongodb,meteor,mongodb-query,Mongodb,Meteor,Mongodb Query,我用的是meteor和mongo数据库 我有两个一对多结构的集合 酒店: { _id:1, name: "Hotel 1" }, { _id:2, name: "Hotel 2" } 预订 {_id:1, hotel_id_:1, date: "2016-05-06", num_nights: 2, dates: ["2016-05-06", "2016-05-06"] }, {_id:2, hotel_id:1
{
_id:1,
name: "Hotel 1"
},
{
_id:2,
name: "Hotel 2"
}
预订
{_id:1,
hotel_id_:1,
date: "2016-05-06",
num_nights: 2,
dates: ["2016-05-06", "2016-05-06"]
},
{_id:2,
hotel_id:1
date: "2016-05-04",
num_nights: 1,
dates: ["2016-05-04"]
},
{_id:3,
hotel_id:2
date: "2016-05-01",
num_nights: 3,
dates: ["2016-05-01", "2016-05-02", "2016-05-03"]
}
我也可以这样保存酒店,因为预订是父母的直接子女:
{
_id:1,
name: "Hotel 1",
bookings:[
{_id:1,
hotel_id_:1,
date: "2016-05-06",
num_nights: 2,
dates: ["2016-05-06", "2016-05-06"]
},
{_id:2,
hotel_id:1
date: "2016-05-04",
num_nights: 1,
dates: ["2016-05-04"]
}
]
}
我正试图找到一种方法,根据任何给定日期的3个标准找到酒店
- 城市名称(Regex-我可以管理)
- 可用性(由酒店提供-我可以管理)
- 在给定日期没有冲突预订
谢谢!我很乐意进一步澄清。由于没有足够的容量,预订似乎仍有问题。 在这种情况下,我们不希望让客户在三个不同的房间预订三晚,因此这应该作为酒店详细信息提供。 为了简化,我们可以只使用容量(房间,或人员/房间的组合),然后我们将能够为客户提供有关可用性的信息
hotel {
id : 1,
roomsCount : 200
}
bookings {
id : 1,
hotelId : 1,
roomsTaken : 1
date : [201605-05, 2016-05-06]
}, {
id : 2,
hotelId : 1,
roomsTaken : 3
date : [2016-05-06, 2016-05-07]
}, {
id : 1,
hotelId : 1,
roomsTaken : 10
date : [2016-05-05, 2016-05-06, 2016-05-07]
}
假设我们想确认2015-05-06是否有4个房间
db.bookings.aggregate([{
$match : {
date : 2016-05-06
}
}, //select only bookings having this date
{
$unwind : date
}, {
$match : {
date : 2016-05-06
}
}, //select only bookings having this date
{
$group : {
_id : null,
roomsTaken : {
$sum : "$roomsTaken"
}
}
}
])
所以当我们得到多少房间被占用时,我们就可以提供多少房间是免费的
作为扩展,我们可以拥有一个房间编号池,并将其标记为免费/保留/使用如果您添加moment套餐(momentjs:moment),您可以检查两个日期是否冲突,如下所示:
var rangeOne = moment.range(startDate, endDate); //you should define your start and end dates
var rangeTwo = moment.range(otherStartDate, otherEndDate); //you should also define the dates here
if(rangeTwo.overlaps(rangeOne) == true) {
//if dates conflict, do something
} else {
//do something when dates don't conflict
}
您还可以在forEach()中使用上面的代码,您可能需要使用这些代码来检查日期是否与任何预订冲突。如果这还不够解释,请用新代码更新您的问题,我将用您可以根据具体需要使用的实际代码编辑我的答案。谢谢。你为我指明了正确的方向。然而,我可能应该提到,酒店和预订只是实际收藏的隐喻,我没有考虑你指出的情况。在我的场景中,“酒店”要么在当晚预订,要么不预订。根本没有房间。对不起,我会在上面澄清的