如何在CosmosDB中对字典键执行不区分大小写的搜索
问题原因
Cosmos DB 不支持在属性索引器[]内使用函数表达式动态计算属性名,因此你之前写的c.Codes[LOWER("CodeSystem2")]语法无法正确识别并定位到对应的字典属性,导致查询不生效。
可行解决方案
方案1:通用JOIN遍历方案(推荐,支持任意未知键的不区分大小写匹配)
通过JOIN操作将Codes字典的键值对拆解为独立条目,分别对键和值做大小写转换后匹配,查询语句如下:
SELECT DISTINCT c.* FROM c -- 遍历Codes下的所有键值对,codeSystem.name为字典键,codeSystem.value为对应的字符串列表 JOIN codeSystem IN c.Codes WHERE -- 对字典键做不区分大小写匹配 LOWER(codeSystem.name) = LOWER("CodeSystem2") -- 先将列表内所有值转小写后,匹配转小写的查询值 AND ARRAY_CONTAINS(ARRAY(SELECT LOWER(item) FROM item IN codeSystem.value), LOWER("x1"))
说明:添加
DISTINCT是为了避免同一个文档匹配到多个Codes键值对时出现重复返回。
性能优化建议
如果你可以调整容器的索引策略,添加以下范围索引可以大幅提升该查询的执行效率:
{ "path": "/Codes/*", "indexType": "Range", "dataType": "String", "precision": -1 }
方案2:枚举键变体方案(仅适合键的可能值范围已知且数量极少的场景)
如果你提前明确目标键可能出现的所有大小写变体,可以直接用OR拼接所有可能的键匹配逻辑,查询性能会比通用方案更高:
SELECT * FROM c WHERE ARRAY_CONTAINS(c.Codes["CodeSystem2"], LOWER('x1')) OR ARRAY_CONTAINS(c.Codes["CODESYSTEM2"], LOWER('x1')) OR ARRAY_CONTAINS(c.Codes["codesystem2"], LOWER('x1'))
内容的提问来源于stack exchange,提问作者Ryan Sangha
相关产品推荐
相关产品推荐

