Mongodb 如何在其他集合中搜索和查找符合条件的父文档

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

我用的是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
    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()中使用上面的代码,您可能需要使用这些代码来检查日期是否与任何预订冲突。如果这还不够解释,请用新代码更新您的问题,我将用您可以根据具体需要使用的实际代码编辑我的答案。

谢谢。你为我指明了正确的方向。然而,我可能应该提到,酒店和预订只是实际收藏的隐喻,我没有考虑你指出的情况。在我的场景中,“酒店”要么在当晚预订,要么不预订。根本没有房间。对不起,我会在上面澄清的