我在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,仍然会产生相同的结果,即无限期挂起。
答案 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}}}
] }
]
})
结果:
我在官方文档中找到的 $或的语法是:
{ $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
}
}
}
]
}
]
}
)
结果:
所以,我认为你的SQL是正确的。数据库中的数据是否非常大?如果你已经挂了很长时间,你有没有看到超时错误消息?或者您可以查看RUs
设置问题。