如何在Azure Cosmos DB中查询完全匹配列与过滤器的项
Azure Cosmos DB 无序完全匹配数组与对象的查询方案
需求说明
需要查询Azure Cosmos DB中的文档,要求:
columns数组与目标数组无序完全匹配(元素完全一致、数量相同,无多余或缺失)filters对象与目标对象无序完全匹配(键值对完全一致、键数量相同,无多余或缺失)
最终仅返回示例1,排除示例2。
实现思路
1. 数组columns的匹配逻辑
通过两个核心条件实现无序完全匹配:
- 数组长度相等,确保无多余/缺失元素
- 原数组的每一个元素都存在于目标数组中,同时目标数组的每一个元素也都存在于原数组中(结合
ARRAY_ALL和ARRAY_CONTAINS实现)
2. 对象filters的匹配逻辑
利用OBJECT_KEYS将对象转为键数组,再复用类似数组的匹配逻辑,同时验证键对应的值相等:
- 对象的键数量相等,确保无多余/缺失键
- 原对象的每一个键都存在于目标对象的键列表中,且对应的值完全一致
完整查询语句(参数化版本)
SELECT * FROM f WHERE -- 匹配columns数组:长度相等 + 元素双向包含 LEN(f.columns) = LEN(@newcolumns) AND ARRAY_ALL(f.columns, c => ARRAY_CONTAINS(@newcolumns, c)) -- 匹配filters对象:键数量相等 + 所有键存在且值匹配 AND LEN(OBJECT_KEYS(f.filters)) = LEN(OBJECT_KEYS(@newfilters)) AND ARRAY_ALL(OBJECT_KEYS(f.filters), k => ARRAY_CONTAINS(OBJECT_KEYS(@newfilters), k) AND f.filters[k] = @newfilters[k] )
参数说明
@newcolumns:目标数组,值为['banana','apple']@newfilters:目标对象,值为{'truck':'blue', 'car':'red'}
效果验证
- 示例1的
columns长度为2,与目标数组长度一致,且所有元素双向包含;filters的键数量为2,所有键对应的值与目标对象完全匹配,因此会被返回。 - 示例2的
columns长度为3(目标数组长度为2),filters的键数量为3(目标对象键数量为2),均不满足长度相等的条件,因此会被过滤。
内容的提问来源于stack exchange,提问作者Dean MacGregor
相关产品推荐
相关产品推荐

