Cosmos DB SQL能否使用参数作为嵌套对象的属性查询键
Azure Cosmos DB 的 SQL 查询语法限制了方括号[]内只能填写字符串字面量,不支持直接放置参数占位符,因此r.metadata[@k1]的写法会触发语法错误。
可用解决方案
方案1:使用内置GetValue()系统函数(推荐)
该函数是Cosmos DB原生提供的动态属性访问接口,完全支持参数化,无SQL注入风险,是该场景的最优解。
正确查询写法如下:
SELECT r.id, r.resourceType, r.metadata FROM Resources r WHERE GetValue(r.metadata, @k1) = @v1
调用时按常规方式传参即可:
@k1传入需要查询的metadata属性名,例如"color"@v1传入对应属性的匹配值,例如"red"
方案2:白名单校验后拼接查询
如果有特殊场景无法使用GetValue(),可以提前维护允许查询的metadata属性名白名单,校验传入的属性名属于白名单范围后,将属性名作为字符串字面量拼接入查询语句,值部分依然保留参数化@v1,兼顾动态性与安全性。
示例拼接完成的查询语句(属性名校验为color时):
SELECT r.id, r.resourceType, r.metadata FROM Resources r WHERE r.metadata['color'] = @v1
内容的提问来源于stack exchange,提问作者Ronald Zarīts
相关产品推荐
相关产品推荐

