0

当我想查询和比较嵌套文档及其在该文档中的字段时,我遇到了问题。总的来说,我有一个餐厅数据库。每个餐厅都有一个名为的文档"openingHours",其中包含一周中每一天的文档,其中包含 3 个字段

1 星期几

2 开放时间

3 关闭时间

在我的查询中,目标是比较每个文档(天)的opening timeand 。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 的屏幕截图,以帮助说明我对文档的意思。您还可以在图像中看到,当它不对每个嵌套文档本身进行查询时会出现问题,因为时间可能每天都不同。

提前致谢!

4

1 回答 1

1

首先,!!像这样管理时间和时间是一个非常糟糕的主意! 如果您的餐厅在 23:00 关门,而我将 2280 作为参数传递,会发生什么?要处理没有日期信息的时间,最好基于自 00:00:00 以来经过的秒数。

storedTime = hours * 3600 + minutes * 60 + seconds

您必须在存储之前使用 +86400 管理您的 openingHours.close 值(午夜后关闭 -> +86400)。这样,您不必在查询中携带大于或小于 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,其中元素匹配日期和当前小时/分钟之间的打开和关闭时间。

于 2018-07-06T13:46:05.990 回答