我是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:欢迎解决我的问题的任何其他架构更改。
答案 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。