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

时间:2014-11-22 07:07:07

标签: mongodb mongoose nosql

我是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的房间,它应该单独返回第3个文档。

P.S:欢迎解决我的问题的任何其他架构更改。

2 个答案:

答案 0 :(得分:2)

你可以试试这个

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

答案 1 :(得分:0)

我猜你可以使用$ lg和$ gt运算符结合$或来计算逻辑。 找到所有未占用的房间,即不占用的房间 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 }}
               ]} 
    })

至少在mongo docs中,elemMatch有一个类似的例子。 这是another link否定elemMatch。