Как сравнить поля в массиве вложенных документов
У меня проблема, когда я хочу запрашивать и сравнивать вложенные документы и их поля в этом документе. В целом у меня есть база данных с ресторанами. В каждом из ресторанов есть документ с именем "opensHours", который содержит документ для каждого дня недели с 3 полями: 1. день недели, 2. время открытия, 3. время закрытия.
В моем запросе цель состоит в том, чтобы сравнить время открытия и время закрытия для каждого из документов (дней).
Проблема сейчас в том, что когда я запускаю свой запрос, я получаю результат, основанный на всех документах в "opensHours", и он не сравнивает каждый из этих документов сам по себе. Причина "$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 ответ
Во-первых, очень плохая идея управлять временем и часами, как это!! Что произойдет, если ваш ресторан закрыт в 23:00, и я передаю 2280 как параметр??? Чтобы иметь дело со временем без информации о дате, лучше опираться на секунды, прошедшие с 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)
},
...
]
}
Теперь вы можете легко запрашивать открытие часов с помощью элемента, соответствующего как дню, так и текущему часу / минуте между временем открытия и закрытия.