Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何比较嵌套文档数组中的字段_Mongodb_Nested Documents_Mongodb 3.6 - Fatal编程技术网

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

Mongodb 如何比较嵌套文档数组中的字段,mongodb,nested-documents,mongodb-3.6,Mongodb,Nested Documents,Mongodb 3.6,当我想查询和比较嵌套文档及其在该文档中的字段时,我遇到了一个问题。总的来说,我有一个关于餐馆的数据库。每个餐厅都有一个名为“openingHours”的文档,该文档包含一周中每一天的文档,其中包含3个字段 1星期一 2开放时间 3关闭时间 在我的查询中,目标是比较每个文档的打开时间和关闭时间 现在的问题是,当我运行我的查询时,我会得到一个基于“openingHours”中所有文档的结果,它不会单独比较每个文档。“$expr”背后的原因是餐馆关门的时间可以延长到01:00,所以我们也需要检查一下

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

1星期一

2开放时间

3关闭时间

在我的查询中,目标是比较每个文档的
打开时间
关闭时间

现在的问题是,当我运行我的查询时,我会得到一个基于
“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}
          }
        ]
      },
    ]
  })
帮助说明我对文件的意思。您还可以在图像中看到,当它没有对每个嵌套文档本身进行查询时,就会出现问题,因为时间可能每天都不同


提前谢谢

首先,!!像这样管理时间和时间是一个非常糟糕的主意 如果你的餐厅23:00关门,而我以param的身份通过2280,会发生什么??? 要处理没有日期信息的时间,最好基于从00:00:00起经过的秒数

storedTime = hours * 3600 + minutes * 60 + seconds
您必须管理您的openingHours.close值,如有必要(午夜后关闭->+86400),然后再存储它。这样,您就不必在查询中执行openingHours.close大于或小于openingHours.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)
    }, 

   ...
]
}
{
“_id”:“hAZyWRwqzM5KM6TZz”,
“名称”:“Spontan餐厅”,
“开放时间”:[
{
“天”:1,
“打开”:72000,//20:00
“关闭”:79200//22:00
}, 
{
“天”:2,
“打开”:54000,//15:00

“close”:90000//我认为你的方法不对。请提供一份json格式的完整文档以提供帮助。嗨,matth,给你。但我并不真正理解你对最终结果的期望:你只想知道openingHours.open是否是sup/inf而不是openingHours.close?查询中的变量openingHours是什么({$gte:openingHours})?结果应该是一个已开业餐厅的列表-变量openingHours将包含一个类似2300的数字,用户已在网站上以表单形式传递。然后根据该数字,我们需要使用每天的开门/关门数字检查餐厅当时是否开业。问题是,现在它计算所有的d如果我搜索周一08:00,餐厅周一关门,但周二08:00开门,它仍然会显示,因为它一直在看。希望它有意义,谢谢你的时间。嗨,MatthPen,很抱歉回来这么晚。谢谢你的回复。我得到它是为了配合你的建议。仅供参考在系统中,你不能选择2280,因为数据来自一个下拉列表,我可以自己设置值。所以以前只有2200、2300等等。但我现在改变了它,使用你写的秒数。