如何在Cosmos DB中查询数组内符合条件的集合属性?
Cosmos DB数组属性查询实现方案
针对你提供的文档结构,要查询addressArray.addresses数组中type为City且city是巴黎(Paris)或纽约(New York)的地址,有两种常用的实现方式,结合你的SQL经验,以下是具体语句和说明:
方式一:展开数组直接筛选目标元素
使用JOIN关键字展开数组,将数组中的每个元素作为独立的查询对象,直接过滤符合条件的地址:
SELECT a FROM c JOIN a IN c.addressArray.addresses WHERE a.type = 'City' AND a.city IN ('Paris', 'New York')
执行后会返回所有符合条件的地址对象,结果示例:
[ { "type": "City", "city": "Paris" }, { "type": "City", "city": "New York" } ]
方式二:保留原文档结构,提取匹配的数组子集
如果需要返回包含符合条件地址的完整文档(或指定字段),同时提取出匹配的地址,可以使用ARRAY_FILTER函数:
SELECT c.id, c.addressArray.type, ARRAY_FILTER(c.addressArray.addresses, a => a.type = 'City' AND a.city IN ('Paris', 'New York')) AS matchingAddresses FROM c WHERE ARRAY_LENGTH(ARRAY_FILTER(c.addressArray.addresses, a => a.type = 'City' AND a.city IN ('Paris', 'New York'))) > 0
ARRAY_FILTER会遍历数组并返回满足条件的元素组成的新数组,WHERE子句确保只返回存在匹配地址的文档,结果示例:
[ { "id": "123", "type": "Home", "matchingAddresses": [ { "type": "City", "city": "Paris" }, { "type": "City", "city": "New York" } ] } ]
补充说明
若只需判断文档中是否存在符合条件的数组元素,可使用ARRAY_CONTAINS结合复杂条件(需指定第三个参数为true启用部分匹配):
SELECT c.id FROM c WHERE ARRAY_CONTAINS(c.addressArray.addresses, {type: 'City'}, true) AND (ARRAY_CONTAINS(c.addressArray.addresses, {city: 'Paris'}, true) OR ARRAY_CONTAINS(c.addressArray.addresses, {city: 'New York'}, true))
这种方式更适合简单的存在性判断,不过直观性不如前两种方案。
内容的提问来源于stack exchange,提问作者Learn AspNet
相关产品推荐
相关产品推荐

