嵌套查询不适用于cosmosdb-mongodb

时间:2017-12-12 22:28:21

标签: javascript mongodb azure azure-cosmosdb spring-data-mongodb

我在cosmosdb中的文档看起来像这样

{
   "todayDate": "2017-12-08",
   "data": [
      {
        "group": {"priority": 1, "total": 10},
        "severity": 1
      },
      {
         "group": {"priority": 2, "total": 13},
         "priority": 2
      }
    ]
}

从天蓝色门户网站中的mmosoShell for cosmosdb或使用我的spring数据mongodb项目发出以下查询时,可以正常工作并立即返回结果:

db.myCollection.find({ "$or" : [ { "data" : { "$elemMatch" : { "priority" : 1}} , "$or" : [ { "data" : { "$elemMatch" : { "group.priority" : 1}}}] }]})

但是,对具有更多OR条件的相同行的以下查询基本上是带有OR运算符的上述查询中的两个,无限期挂起:

db.myCollection.find({ "$or": [ { "data" : { "$elemMatch" : { "priority" : 1}} , "$or" : [ { "data" : { "$elemMatch" : { "group.priority" : 1}}}] }, { "data" : { "$elemMatch" : { "severity" : 2}} , "$or" : [ { "data" : { "$elemMatch" : { "group.severity" : 2}}}] } ] })

上次查询是否有任何问题导致其无限期挂起?即使我用AND替换初始OR,仍然会产生相同的结果,即无限期挂起。

1 个答案:

答案 0 :(得分:0)

我根据您提供的文档模板在我的cosmos数据库中创建了3个文档。

[
  {
    "id": "1",
    "todayDate": "2017-12-08",
    "data": [
      {
        "group": {
          "severity": 1,
          "total": 10
        },
        "severity": 1
      },
      {
        "group": {
          "priority": 1,
          "total": 13
        },
        "priority": 1
      }
    ]
  },
  {
    "id": "2",
    "todayDate": "2017-12-09",
    "data": [
      {
        "group": {
          "priority": 3,
          "total": 10
        },
        "severity": 1
      },
      {
        "group": {
          "priority": 3,
          "total": 13
        },
        "priority": 1
      }
    ]
  },
  {
    "id": "3",
    "todayDate": "2017-12-10",
    "data": [
      {
        "group": {
          "priority": 1,
          "total": 10
        },
        "severity": 1
      },
      {
        "group": {
          "priority": 2,
          "total": 13
        },
        "priority": 2
      }
    ]
  }
]

然后我使用Robo 3T工具来执行你的SQL。

db.coll.find({ 
"$or": [ 
    { "data" : { "$elemMatch" : { "priority" : 1}} , 
    "$or" : [ 
        { "data" : { "$elemMatch" : { "group.priority" : 1}}}
    ] }, 
    { "data" : { "$elemMatch" : { "severity" : 2}} , 
    "$or" : [ 
        { "data" : { "$elemMatch" : { "group.severity" : 2}}}
    ] } 
]  
})

结果:

enter image description here

我在官方文档中找到的 $或的语法是:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

虽然它与上述语法不同,但您的SQL似乎可以正常执行。根据我的经验, $或通常用 $和MongoDB Nested OR/AND Where?)嵌套,所以我不太明白你的目的是什么? strong> $或嵌套在这里。

当然,无限期挂起可能是因为数据太大而导致SQL运行时间过长而您需要优化SQL。

希望它对你有所帮助。有任何疑虑,请告诉我。

更新答案:

我已正确修改了我的3个示例文档,然后通过您提供的SQL查询了2个符合条件的文档。

SQL:

db.coll.find(
{
    "$and": [
        {
            "$or": [
                {
                    "data": {
                        "$elemMatch": {
                            "priority": 2
                        }
                    }
                },
                {
                    "data": {
                        "$elemMatch": {
                            "group.priority": 2
                        }
                    }
                }
            ]
        },
        {
            "$or": [
                {
                    "data": {
                        "$elemMatch": {
                            "severity": 1
                        }
                    }
                },
                {
                    "data": {
                        "$elemMatch": {
                            "group.severity": 1
                        }
                    }
                }
            ]
        }
    ]
}
)

结果:

enter image description here

所以,我认为你的SQL是正确的。数据库中的数据是否非常大?如果你已经挂了很长时间,你有没有看到超时错误消息?或者您可以查看RUs设置问题。