查找基于在对象的数组不匹配属性匹配的文件 - MongoDB的
问题描述:
我是新来的MongoDB或NoSQL的,我已在我的房间托收,查找基于在对象的数组不匹配属性匹配的文件 - MongoDB的
/* 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:任何其他解决我的问题的架构更改也欢迎。
答
你可以试试这个
db.yourcollection.find({ bookedFor : { $elemMatch : { startTime : 1300, endTime : 1400 } } }).sort({ roomId : -1 }).limit(1)
答
我想你可以使用$ 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。
嗨Styvane,它没有按照我的预期工作。它将返回已经预订了1300到1400的文件。另外还有一个挑战是,它应该只返回第三个文件,即使是1350到1450,因为时间与先前预订的时间冲突。 +1帮助手。 :)请再次帮助我。 – 2014-11-22 08:05:48
这不起作用。因为,你只是更新了排序顺序。我首先关心的是,它将返回所有已预订了1300 - 1400 **的文档。但是我期望的是,它应该只返回最后一个文件,这个文件是**没有被预订** 1300 - 1400。 – 2014-11-22 08:34:41