Как сравнить поля в массиве вложенных документов - PullRequest
0 голосов
/ 06 июля 2018

У меня проблема, когда я хочу запрашивать и сравнивать вложенные документы и их поля в этом документе. В целом у меня есть база данных с ресторанами. В каждом из ресторанов есть документ "openingHours", который содержит документ на каждый день недели с 3 полями

1 День недели

2 Время открытия

3 Время закрытия

В моем запросе цель состоит в том, чтобы сравнить opening time и closing time для каждого из документов (дней).

Проблема сейчас в том, что когда я запускаю свой запрос, я получаю результат, основанный на всех документах внутри "openingHours", и он не сравнивает каждый из этих документов сам по себе. Причина "$expr" в том, что время закрытия ресторанов может быть увеличено до 01:00, поэтому мы должны это проверить.

Вот мой запрос:

$or: [
      {
        $and: [
          { 
            "$expr" : {
                "$gt" : [
                    "$openingHours.open", 
                    "$openingHours.close"
                ]
            }
          },
          {
            "openingHours.close": {$gte: openingHours}
          }
        ]
      },
      {
        $and: [
          { 
            "$expr" : {
                "$gt" : [
                    "$openingHours.open", 
                    "$openingHours.close"
                ]
            }
          },
          {
            "openingHours.close": {$lte: openingHours}
          },
          {
            "openingHours.open": {$lte: openingHours}
          }
        ]
      },
      {
        $and: [
          { 
            "$expr" : {
                "$lt" : [
                    "$openingHours.open", 
                    "$openingHours.close"
                ]
            }
          },
          {
            "openingHours.open": {$lte: openingHours}
          },
          {
            "openingHours.close": {$gte: openingHours}
          }
        ]
      },
    ]
  })

Скриншот из Robo3t , чтобы помочь показать, что я имею в виду с документами. Также на рисунке видно, что проблема возникает, когда он не выполняет запрос для каждого из вложенных документов, так как время может различаться изо дня в день.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Во-первых, !! Это очень плохая идея - управлять временем и часами, как это !! Что произойдет, если ваш ресторан закрыт в 23:00, и я передаю 2280 как параметр ??? Чтобы иметь дело со временем без информации о дате, лучше опираться на секунды, прошедшие с 00:00 до 00:00.

storedTime = hours * 3600 + minutes * 60 + seconds

вам необходимо при необходимости изменить значение значение opensHours.close с +86400 (закрыть после полуночи -> + 86400), прежде чем сохранять его. Таким образом, вам не придется иметь дело с opensHours.close больше или меньше, чем opensHours.open в вашем запросе.

{
"_id" : "hAZyWRwqzM5KM6TZz",
"name" : "Restaurant Spontan",
"openingHours" : [ 
    {
        "day" : 1,
        "open" : 72000,   // 20:00
        "close" : 79200   //22:00
    }, 
    {
        "day" : 2,
        "open" : 54000,    //   15:00
        "close" : 90000     // <= 01:00 = 24:00 (86400) + 01:00 (3600)
    }, 

   ...
]
}

Теперь вы можете легко запрашивать открытие часов с помощью элемента, соответствующего как дню, так и текущему часу / минуте между временем открытия и закрытия.

...