如何比较嵌套文档数组中的字段

How to compare fields in an array of nested documents

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

1 The day of the week

2 Opening time

3 Closing time

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

提前致谢!

首先,!!像这样管理时间和时间是一个非常糟糕的主意! 如果您的餐厅在 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,其元素在开市时间和闭市时间之间匹配日期和当前 hour/minute。