首页 > 解决方案 > 对于在普通 mongo 服务器中成功执行的特定查询,带有 Mongo API 的 CosmosDB 失败的原因是什么?

问题描述

我计划将我所有的 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 中成功执行!!

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

标签: mongodbazureazure-cosmosdbazure-cosmosdb-mongoapi

解决方案


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


推荐阅读