同一集合不同分区的文档数组关联查询问题求助
解决Cosmos DB跨分区子查询IN语句不生效的问题
我之前也碰到过一模一样的Cosmos DB查询问题!你的核心问题在于Cosmos DB对IN子句的处理逻辑——当你用子查询返回数组时,IN会把整个数组当作单个匹配项,而不是自动展开数组里的每个元素去匹配,这就导致你的查询永远找不到符合条件的文档。
为什么原来的写法失效?
你单独执行子查询返回的是一个数组:["84abab45-d60e-48b0-9e94-4420bb436196", "0be54840-bbd3-42ea-a120-949edb36a4f6"],但Cosmos DB的IN子句会把这个数组当成一个整体,尝试判断p.SupplierOrder_id是否等于这个数组(显然不可能),而不是检查p.SupplierOrder_id是否是数组中的某一个元素。而你直接写ID列表时,IN拿到的是多个离散的字符串值,自然能正常匹配。
修正方案:用ARRAY_CONTAINS替代IN
你可以用ARRAY_CONTAINS函数来实现需求,它会直接检查字段值是否存在于子查询返回的数组中,完美适配你的场景:
SELECT * FROM p WHERE p.partition = "Positions" AND ARRAY_CONTAINS( -- 这里是你的子查询,返回目标ID数组 (SELECT VALUE so.id from so where so.OfferId = "883ed603-69a9-4a81-a144-93957fc5a2e2" and so.partition = "SupplierOrders"), p.SupplierOrder_id )
另一种方案:使用JOIN关联子查询结果
如果你更喜欢用JOIN的写法,也可以用下面的查询,它会把子查询返回的数组展开为单个元素,再和Positions分区的文档做匹配:
SELECT p.* FROM p JOIN targetId IN (SELECT VALUE so.id FROM so WHERE so.OfferId = "883ed603-69a9-4a81-a144-93957fc5a2e2" AND so.partition = "SupplierOrders") WHERE p.partition = "Positions" AND p.SupplierOrder_id = targetId
这两种写法都能实现单次查询获取目标Positions数组的需求,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Nikita Sychou
相关产品推荐
相关产品推荐

