2015-10-29 2 views
2

У меня есть коллекция ресторанов, которые я бы хотел запросить, если они открыты или нет. Запрос должен работать через границы дня (например, с 10:00 до 01:00). Их часы работы пока не определены в коллекции, но я могу установить схему на основе ответов на этот вопрос.MongoDB: Как запросить между двумя часами?

Но, к примеру, скажем, у меня есть коллекция, как это:

[ 
    { 
     "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" 
       } 
       } 
    }  
]   

на основе текущего времени суток и дня недели, как бы я запроса к базе данных для всех ресторанов, которые в настоящее время открыты? В настоящее время я просто нахожу все рестораны и делаю логику на питоне. Я хотел бы просто сделать манго, если это возможно. ЕЩЕ РАЗ! Схема часов может меняться в соответствии с ответом.

+1

не может дать точный ответ, но если вы в состоянии написать [УД «хранимая процедура»] (HTTP: // dirolf .com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html), я бы рекомендовал конвертировать каждое открытое и закрытое время в 'unixtime' (или 'utc'), тогда вы могли бы сделать' if open_time <= now и now <= close_time'. Но вам все равно нужно добавить материал, чтобы конвертировать время открывания и закрытия (в выбранную временную шкалу obj) в течение различных дней, а затем проверять каждый против now_time. Опять же, возможно, сделать через js, но обратите внимание, что это не эквивалентно хранимой процедуре; просто смутно похожи. И не может быть эффективным с точки зрения запросов. – aneroid

+0

Кроме того, 'open_time' должен быть создан/рассчитан против ** текущей ** даты/времени, чтобы это сравнение работало. Стоит попробовать, но на основе скорости, он может быть не намного эффективнее, чем ваш текущий подход «получить от запроса и процесса в python»; так как служебные данные запроса будут по-прежнему применяться для js-proc. – aneroid

+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" 
     } 
     ] 
    } 
] 
+0

Спасибо. Будет ли он работать через дневные границы, такие как 1200 - 0100? –

+0

Вы можете сделать это, поддерживая дневные границы, добавив дополнительные записи на следующий день, см. Мой исправленный пост. Если вы хотите обработать это более элегантно, вам нужно преобразовать ваши часы в дату, когда вы запрашиваете. – Jaco