You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 10:45:04