【问题标题】:MongoDB: How to query between two hours?MongoDB:如何在两个小时之间查询?
【发布时间】:2016-01-29 21:32:44
【问题描述】:

我有一些餐馆,我想查询它们是否营业。查询必须跨越日界(例如上午 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 去做。再次! “小时”架构可以更改以适合答案。

【问题讨论】:

  • 无法给出准确的答案,但如果你能写出js "stored procedure",我建议将每个打开和关闭时间转换为unixtime(或“UTC”),然后你可以做if open_time <= now and now <= close_time。但是你仍然需要添加一些东西来转换不同日期的打开和关闭时间(到选择的时间戳 obj),然后根据 now_time 检查每个时间。同样,也许可以通过 js 实现,但请注意它不等同于存储过程;只是隐约相似。并且可能查询效率不高。
  • 此外,必须根据 当前 日期/时间创建/计算 open_time,以便进行比较。值得尝试,但基于速度,它可能不会比您当前的“从 python 中的查询和处理中获取”方法更有效;因为查询开销仍然适用于 js-proc。
  • 是的,我基本上是在查询之外执行所有这些逻辑。我不知道这两种方法之间是否存在速度差异。加上我的 python 逻辑现在可以工作了。如果它存在的话,我正在寻找银弹:)

标签: python mongodb


【解决方案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"
         }
      ]
   }
]

【讨论】:

  • 谢谢。它会在 1200 - 0100 等日期范围内工作吗?
  • 您可以通过为第二天添加额外的条目来使其支持日期边界,请参阅我修改后的帖子。如果您想更优雅地处理此问题,则需要在查询时将小时数转换为日期时间值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多