【问题标题】:How can I search and find parent document which meet criteria in other collection如何在其他集合中搜索和查找符合条件的父文档
【发布时间】:2016-05-06 07:36:50
【问题描述】:

我正在使用流星和 mongo db

我有两个具有一对多结构的集合

酒店:

{
    _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 个条件查找酒店

  • 城市名称(正则表达式 - 我可以管理)
  • 可用性(由酒店提供 - 我可以管理)
  • 给定日期的预订没有冲突

编辑:

Hotels 和 Bookings 是我实际设置的隐喻,但它们非常相似。 假设酒店在给定日期已预订或未预订没有“房间”

/编辑

我可以找到给定酒店的预订,但我不知道如何组合所有酒店以找到满足前两个要求但没有冲突预订的酒店,因为目前的预订位于单独的集合中

有没有办法找到首先满足前两个条件的酒店,然后过滤掉不满足第二个条件的酒店 - 无需手动遍历每个文档

谢谢!我很乐意进一步澄清。

【问题讨论】:

    标签: mongodb meteor mongodb-query


    【解决方案1】:

    由于没有提供容量,因此预订似乎仍然存在问题。 在这种情况下,我们不希望客户在三个不同的房间预订三晚 - 所以这应该作为酒店详细信息提供。 为简化起见,我们可以仅使用容量(房间或人员/房间组合),然后我们将能够为客户提供有关可用性的信息。

    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"
                    }
                }
            }
        ])
    

    所以当我们得到多少房间被占用时,我们就可以提供多少房间是空闲的。

    作为扩展,我们可以有一个房间号池并将它们标记为空闲/保留/使用中

    【讨论】:

    • 谢谢。你肯定给我指出了正确的方向。但是我可能应该提到酒店和预订只是实际收藏的隐喻,我没有考虑你指出的情况。在我的场景中,要么在那天晚上预订了“酒店”,要么没有。没有房间本身。对不起,我会在上面澄清
    【解决方案2】:

    如果你添加 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() 中使用上面的代码,因为您需要检查日期是否与任何预订冲突。如果这还不够解释,请使用新代码更新您的问题,我将使用可用于您的特定需求的实际代码编辑我的答案。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2019-03-08
      • 2020-08-25
      • 2014-08-12
      • 2020-12-15
      • 2014-01-14
      • 2014-10-10
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多