根据对象数组中的不匹配属性查找匹配文档-MongoDB

根据对象数组中的不匹配属性查找匹配文档-MongoDB,mongodb,mongoose,nosql,Mongodb,Mongoose,Nosql,我是MongoDB或NoSQL的新手,我的Rooms集合中有一组文档 /* 1 */ { "roomId" : 1, "bookedFor" : [ { "startTime" : 1000, "endTime" : 1100 }, { "startTime" : 1300, "endTime" : 1400 },

我是MongoDB或NoSQL的新手,我的Rooms集合中有一组文档

/* 1 */
{
    "roomId" : 1,
    "bookedFor" : [ 
        {
            "startTime" : 1000,
            "endTime" : 1100
        }, 
        {
            "startTime" : 1300,
            "endTime" : 1400
        }, 
        {
            "startTime" : 1800,
            "endTime" : 1900
        }
    ]
}

/* 2 */
{
    "roomId" : 3,
    "bookedFor" : [ 
        {
            "startTime" : 0900,
            "endTime" : 1000
        }, 
        {
            "startTime" : 1400,
            "endTime" : 1500
        }, 
        {
            "startTime" : 1300,
            "endTime" : 1400
        }
    ]
}

/* 3 */
{
    "roomId" : 2,
    "bookedFor" : [ 
        {
            "startTime" : 1000,
            "endTime" : 1100
        }, 
        {
            "startTime" : 1800,
            "endTime" : 1900
        }, 
        {
            "startTime" : 0900,
            "endTime" : 1000
        }
    ]
}
现在我想做的是,我需要找一个房间,在要求的时间内不应该预订

例如,如果我想预订startTime:1300和endTime:1400的房间,它应该单独返回第三个文档

p.S:任何其他解决我问题的模式更改都是受欢迎的。您可以试试这个

db.yourcollection.find( { bookedFor : { $elemMatch : { startTime : 1300, endTime : 1400 } } } ).sort( { roomId : -1 } ).limit(1)

我想您可以使用$lg和$gt运算符以及$or来计算逻辑。 找到所有没有人住的房间 1) 在吃角子老虎机期间开始预订 2) 在吃角子老虎机期间结束预订 3) 在吃角子老虎之前和之后进行预订 4) 在吃角子老虎机期间进行短期预订

在这种情况下,这将转化为:

db.yourcollection
    .find( {bookedFor : {
               $and:[{ 
                 {$not: {$elemMatch :{ startTime : { $gt : 1300, $lt: 1400 }},
                 {$not: {$elemMatch :{ startTime : { $gt : 1300, $lt: 1400 }},
                 {$not: {$elemMatch :{ startTime : { $lt : 1300}, endTime: {$gt: 1400 }}
                 {$not: {$elemMatch :{ startTime : { $gt : 1300}, endTime: {$lt: 1400 }}
               ]} 
    })
至少在中,elemMatch有一个类似的例子。
下面是对elemMatch的否定。

嗨,Styvane,它没有像我预期的那样工作。它正在归还预订了1300到1400年的文件。还有一个挑战是,即使在1350到1450之间,它也应该只返回第三个文档,因为时间与之前预定的时间冲突+1.伸出援助之手。:)请再帮我一次,它坏了。因为,您刚刚更新了排序顺序。我的第一个问题是,它正在退回所有预订1300-1400的文件。但我期望的是,它应该只返回最后一份文件,而不是预定1300-1400的文件。