首页 > 解决方案 > 如何在 CosmosDB 中对字典键进行不区分大小写的搜索?

问题描述

我想不出一种方法来对 ComsosDB 中的字典键进行不区分大小写的搜索。我的对象如下所示:

...
"Codes": {
      "CodeSystem1": [
         "A1", "A2"
       ],
      "CodeSystem2": [
        "x1","x2"
     ]
},
...

代码是一个Dictionary<string, List<string>>

我的查询如下所示:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.Codes["CodeSystem2"], 'x1')

但是,我想对字典键和值都执行 LOWER(),但它不是那样工作的。

SELECT * FROM c WHERE ARRAY_CONTAINS(c.Codes[LOWER("CodeSystem2"]), LOWER('x1'))

有任何想法吗?我不能更改对象的结构,也不能在我的 .NET 代码中进行过滤。

标签: sqlazure-cosmosdb

解决方案


LOWER/UPPER 不会像您希望的那样与 Array 元素一起使用。如果你有这样的事情:

 "CodeSystem4": [
            "Z1"
        ],
        "CodeSystem5": "Z3"

我们可以使用下面的元素 CodeSystem5 如下:

select * from c where lower(c.Codes["CodeSystem5"]) = Lower('Z3')

但是我们不能对带有 ARRAY_CONTAINS 的 'CodeSystem4' 做同样的事情,它不会返回任何结果。

同样根据下面的文章,“ LOWER 系统函数不使用索引。如果您打算进行频繁的不区分大小写的比较,则 LOWER 系统函数可能会消耗大量的 RU。如果是这种情况,请不要使用LOWER系统功能,每次比较数据归一化,插入时可以对套管进行归一化。 "

https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-lower

一种方法是添加另一个小写的可搜索数组以使其通过查询工作。否则我们可以通过 SDK 过滤


推荐阅读