Cosmos DB中如何将动态查询结果作为ARRAY_CONTAINS的数组参数
问题分析与解决
问题场景
现有查询能返回符合需求的近似结果,但数组条件无法硬编码,需要动态生成:
SELECT * FROM a in c.Things WHERE ARRAY_CONTAINS(['ThingA', 'ThingB'], a.Name)
动态生成目标数组的查询如下,执行后会返回类似['ThingOne', 'ThingTwo']的结果:
select VALUE ARRAY ( SELECT VALUE a.Name FROM a in c.Things where a.Visible) from c WHERE c.Discriminator='Type'
尝试将动态查询嵌套到ARRAY_CONTAINS中时,出现错误:
Microsoft.Azure.Cosmos.Query.Core.Exceptions.ExpectedQueryPartitionProviderException: {"errors":[{"severity":"Error","location":{"start":147,"end":148},"code":"SC2001","message":"Identifier 'c' could not be resolved."}
错误原因
- 变量重名与作用域冲突:嵌套查询里的
a和外层的a重名,同时子查询的c和外层主查询的c作用域重叠,导致Cosmos DB无法正确解析标识符。 - 返回结构不匹配:如果
c.Discriminator='Type'匹配多个文档,子查询会返回数组的数组,而ARRAY_CONTAINS需要接收一维数组作为参数,结构不兼容。
修正后的查询
场景1:Discriminator='Type'的文档只有一个
用TOP 1确保子查询返回单个一维数组,同时给变量重命名避免冲突:
SELECT * FROM attr IN c.Attributes WHERE ARRAY_CONTAINS( (SELECT TOP 1 VALUE ARRAY( SELECT VALUE thing.Name FROM thing IN c.Things WHERE thing.Visible ) FROM c WHERE c.Discriminator = 'Type'), attr.Name )
场景2:Discriminator='Type'的文档有多个
如果需要匹配所有符合条件文档的数组集合,可以用JOIN来关联:
SELECT * FROM attr IN c.Attributes JOIN dynamicArray IN ( SELECT VALUE ARRAY( SELECT VALUE thing.Name FROM thing IN c.Things WHERE thing.Visible ) FROM c WHERE c.Discriminator = 'Type' ) WHERE ARRAY_CONTAINS(dynamicArray, attr.Name)
内容的提问来源于stack exchange,提问作者adhdj
相关产品推荐
相关产品推荐

