You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:54:05