我想查询和比较嵌套文档及其在该文档中的字段时遇到问题。总的来说,我有一个餐厅数据库。每个餐厅都有一个名为"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}
}
]
},
]
})
Screenshot from Robo3t来帮助说明我对文档的意思。您还可以在图像中看到,如果不对每个嵌套文档本身进行查询,就会出现问题,因为时间每天都有所不同。
提前谢谢!
答案 0 :(得分:1)
首先, !!管理这样的时间和时间是一个非常糟糕的主意! 如果您的餐厅在23:00关闭,并且我通过2280作为参数,会发生什么??? 要处理没有日期信息的时间,最好以从00:00:00开始经过的秒为基础。
storedTime = hours * 3600 + minutes * 60 + seconds
在存储之前,必须使用+86400(在午夜之后关闭-> + 86400)管理您的openHours.close值。这样,您不必在查询中携带大于或小于openingHours.open的openingHours.close。
{
"_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)
},
...
]
}
现在,您可以轻松地查询openingHours,其元素与开放时间和关闭时间之间的日期和当前小时/分钟匹配。