对于在普通 mongo 服务器中成功执行的特定查询,使用 Mongo API 的 CosmosDB 失败的原因是啥?

Posted

技术标签:

【中文标题】对于在普通 mongo 服务器中成功执行的特定查询,使用 Mongo API 的 CosmosDB 失败的原因是啥?【英文标题】:What is the reason for CosmosDB with Mongo API fails for a particular query which execute successfully in the normal mongo server?对于在普通 mongo 服务器中成功执行的特定查询,使用 Mongo API 的 CosmosDB 失败的原因是什么? 【发布时间】:2021-11-19 14:55:36 【问题描述】:

我计划将我所有的 mongoDb 数据库迁移到 azure cosmosDB。出于测试目的,我试图通过使用 mongo API 作为底层数据源制作 azure cosmosDB 来测试所有查询。我能够通过在 cosmosDB 中创建一些自定义索引(单字段/通配符)来执行所有查询。但是一个特定的查询失败了。我找不到任何明显的原因。查询如下(使用 $in 运算符,查询有点过长。我怀疑)

db.getCollection("rules").find(
   "$and":[
      
         "$or":[
            
               "subRules.ALL.leftOperand":"GROUP",
               "subRules.ALL.rightOperand":
                  "$in":[
                       <4000+ values>
                  ]
               
            ,
            
               "subRules.ALL.leftOperand":"MACHINE",
               "subRules.ALL.rightOperand":
                  "$in":[
                       <4000+ values>
                  ]
               
            
         ]
      ,
      
         "ruleName":
            "$regex":""
         
      
   ],
   "subRules.ANY.leftOperand":
      "$ne":"COFFEE_AMOUNT"
   
)

这个精确的查询在 mongo 服务器上运行良好。但是当我在天蓝色的宇宙中运行它时。我收到以下错误

error: 
    "ok" : 0,
    "errmsg" : "Error=2, Details='Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: 443df8b1-136f-4018-9d77-63b3442ab7f8; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: 443df8b1-136f-4018-9d77-63b3442ab7f8; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: 443df8b1-136f-4018-9d77-63b3442ab7f8; Reason: (Message: ��errors�ꠈseverity�Error�location�\u000e�start\u0000�end�5\u0002�code�SC3031�message~pTt\u00194�2A�zY�\u0007���r�\\&���2�\u001dƧ��6�]o��r��\f�6�E�\rz���0�-���a:\u001a�.��t4�\u001c���av�=.�@Tt\u0019\u0014f���2\u0019�N��tPz\u000e��\\\r\nActivityId: 443df8b1-136f-4018-9d77-63b3442ab7f8, Request URI: /apps/27c904fe-36bc-4acd-b55d-2c8494082ce7/services/c88f5dcc-2b90-4935-9281-38171d9dd72a/partitions/398285ee-29c1-4564-8e79-91c184ef65dd/replicas/132769491079094442s/, RequestStats: Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum, SDK: Windows/10.0.17763 cosmos-netstandard-sdk/3.18.0);););",
    "code" : 2,
    "codeName" : "BadValue"

我尝试在特定集合上创建通配符索引。还是失败了。

注意:当 $in 运算符的数组中的值很少时,查询在 cosmosDB 中也可以成功执行!

如果有人能对这个问题有所了解,将不胜感激。谢谢

【问题讨论】:

我不知道具体原因,但是 cosmosDb API 和 mongo API 不是 100% 兼容 【参考方案1】:

我认为此时您已经找到了解决方法,但以防万一,您正在将正确版本的 mongodb 与 cosmos 进行比较?请记住,cosmos 是 4 或更少,mongodb 实际上是 v5。 无论如何,具有大量要比较的值的“$IN”子句可能是一个瓶颈,无论是 SQL 还是非 SQL,您是否尝试过使您的“IN”列表成为可查找的集合?这可能适用于 cosmos

【讨论】:

以上是关于对于在普通 mongo 服务器中成功执行的特定查询,使用 Mongo API 的 CosmosDB 失败的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Mongo查询list数组中一个字段大于特定条数

Mongo 查询失败,错误代码 13 和错误消息“未授权”

Mongo 查询失败,错误代码 13 和错误消息“未授权”

用于收集超过 1000 万条记录的 Mongo 查询优化

在mongo中执行优先查询

JS写mongo命令