2014-11-22 19 views
2

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

回答

2

你可以试试这个

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

嗨Styvane,它没有按照我的预期工作。它将返回已经预订了1300到1400的文件。另外还有一个挑战是,它应该只返回第三个文件,即使是1350到1450,因为时间与先前预订的时间冲突。 +1帮助手。 :)请再次帮助我。 – 2014-11-22 08:05:48

+0

这不起作用。因为,你只是更新了排序顺序。我首先关心的是,它将返回所有已预订了1300 - 1400 **的文档。但是我期望的是,它应该只返回最后一个文件,这个文件是**没有被预订** 1300 - 1400。 – 2014-11-22 08:34:41

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。