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

时间:2018-07-06 10:32:59

标签: mongodb nested-documents mongodb-3.6

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

  

1星期几

     

2营业时间

     

3关门时间

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

提前谢谢!

1 个答案:

答案 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,其元素与开放时间和关闭时间之间的日期和当前小时/分钟匹配。