如何在CosmosDB跨多个文档合并数组字段并提取全局唯一值
可行实现方案
可以通过Cosmos DB NoSQL API的内置数组函数,直接完成跨文档的Cedents数组合并、元素级去重,最终返回和你示例完全一致的单对象结果集。
两种常用实现写法如下:
方案1:数组聚合写法(推荐)
利用内置聚合函数ARRAY_CONCAT_AGG跨文档拼接所有Cedents数组,再配合ARRAY_DISTINCT完成元素级去重,查询语句:
SELECT ARRAY_DISTINCT( ARRAY_CONCAT_AGG(c.Cedents) ) AS Cedents FROM c
ARRAY_CONCAT_AGG:自动聚合遍历范围内所有文档的Cedents数组,将多个独立数组拼接为完整的一维数组,无需手动处理嵌套层级ARRAY_DISTINCT:对拼接完成的一维数组逐元素去重,剔除重复值
方案2:展平嵌套写法(兼容旧版本)
如果运行环境不支持ARRAY_CONCAT_AGG,可以通过子查询提取所有Cedents数组,展平嵌套层级后再去重,查询语句:
SELECT ARRAY_DISTINCT( ARRAY_FLATTEN( (SELECT VALUE c.Cedents FROM c) ) ) AS Cedents
各步骤逻辑:
SELECT VALUE c.Cedents:跳过默认的对象包装,直接把每个文档的Cedents数组作为集合元素返回,最终得到嵌套了所有文档Cedents数组的二维集合ARRAY_FLATTEN:将二维嵌套的数组合并展平为一维数组ARRAY_DISTINCT:对展平后的一维数组做元素级去重
常见注意点
- 最初使用的
SELECT DISTINCT c.Cedents写法无法达成目标,因为DISTINCT的作用对象是整行查询记录,仅会对每个文档返回的完整Cedents数组做行级去重,既不会跨文档合并数组,也不会对数组内部的元素做去重 - 跨文档数组聚合操作在单分区内执行效率最优,跨分区执行时RU开销会显著上升,文档量较大时可能触发查询超时,建议查询前确认分区键匹配逻辑
内容的提问来源于stack exchange,提问作者Michael Böckling
相关产品推荐
相关产品推荐

