MongoDB:如何在两个小时之间查询?

时间:2015-10-29 16:11:47

标签: python mongodb

我有一些餐馆,我想查询它们是否开放。查询必须跨越日界(例如上午10:00 - 凌晨01:00)。它们的工作时间目前尚未在集合中定义,因此我可以根据此问题的答案设置架构。

但是,例如,假设我有一个这样的集合:

    [
    {
      "name": "Pete's Bar",
      "hours":
              {
                "Sun": {
                  "open": "0800",
                  "close": "1800"
                },
                "Mon": {
                  "open": "0800",
                  "close": "1800"
                },
                "Tue": {
                  "open": "0800",
                  "close": "1800"
                },
                "Wed": {
                  "open": "closed",
                  "close": "closed"
                },
                "Thu": {
                  "open": "0800",
                  "close": "1800"
                },
                "Fri": {
                  "open": "0800",
                  "close": "0100"
                },
                "Sat": {
                  "open": "0800",
                  "close": "0100"
                }
              }
    }       
]        

根据当前时间和星期几,我如何在数据库中查询当前打开的所有餐馆?我目前只是找到所有餐馆并在python中执行逻辑。如果可能的话,我想让mongo做。再次! “小时”架构可以改变以适应答案。

1 个答案:

答案 0 :(得分:1)

更改数据模型后(请参阅本文末尾),下面的查询将返回当前打开的所有餐馆。您可以通过添加一天的其他条目来使此查询在日期边界上工作。例如,下面我在星期日00:00到01:00之间添加了一个条目,实际上延长了星期六(08:00到24:00)的开放时间。有更优雅的方法来实现这一点,例如参见@aneroid对你的问题的评论。

var now = new Date();
var weekday =["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
var day=weekday[now.getDay()]
var hour=now.getHours()+'00'

db.openinghours.find({
        hours: {
            $elemMatch: {
                "day": day,
                "open": {
                    $lte: hour,
                    $ne: "closed"
                },
                "close": {
                    $gte: hour,
                    $ne: "closed"
                }

我已将您的模型更改为:

[  
   {  
      "name":"Pete's Bar",
      "hours":[
         {  
            "day":"Sun",
            "open":"0000",
            "close":"0100"
         },  
         {  
            "day":"Sun",
            "open":"0800",
            "close":"1800"
         },
         {  
            "day":"Mon",
            "open":"0800",
            "close":"1800"
         },
         {  
            "day":"Tue",
            "open":"0800",
            "close":"1800"
         },
         {  
            "day":"Wed",
            "open":"closed",
            "close":"closed"
         },
         {  
            "day":"Thu",
            "open":"0800",
            "close":"1800"
         },
         {  
            "day":"Fri",
            "open":"0800",
            "close":"1800"
         },
         {  
            "day":"Sat",
            "open":"0800",
            "close":"2400"
         }
      ]
   }
]