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

如何编写Cosmos DB查询按GroupId聚合Location和Status数组

Cosmos DB 查询:按GroupId分组获取指定字段的唯一值集合

需求说明

给定Cosmos DB集合中的示例数据:

[
    {
        "id": "00000000-0000-0000-454c-4b74472b01d8",   
        "GroupId": 1,
        "Location": "London",
        "Status": "Ok"
    },
    {
        "id": "d129adeb-d1bf-4a89-afe3-93e3f60589fb",   
        "GroupId": 1,
        "Location": "Liverpool",
        "Status": "Ok"
    },
    {
        "id": "85ecf875-0e32-40b5-823a-a2545694f9b6",   
        "GroupId": 2,
        "Location": "Manchester",
        "Status": "Nok"
    }
]

需要实现:指定GroupId后,返回该分组下Location和Status的所有唯一值数组,例如指定GroupId=1时返回:

{
    "Location": ["London", "Liverpool"],
    "Status": ["Ok"]
}

可行查询方案

方案1:带DISTINCT的子查询数组(单分组查询)

这种写法直接针对指定分组,生成去重后的字段数组:

-- 替换@groupId为具体分组ID,如1或2
SELECT 
    ARRAY(SELECT DISTINCT VALUE c.Location FROM c WHERE c.GroupId = @groupId) AS Location,
    ARRAY(SELECT DISTINCT VALUE c.Status FROM c WHERE c.GroupId = @groupId) AS Status

方案2:GROUP BY + ARRAY_AGG(支持单/多分组查询)

利用Cosmos DB的ARRAY_AGG聚合函数结合DISTINCT,可以实现分组聚合:

-- 查询单个分组
SELECT 
    ARRAY_AGG(DISTINCT c.Location) AS Location,
    ARRAY_AGG(DISTINCT c.Status) AS Status
FROM c
WHERE c.GroupId = 1
GROUP BY c.GroupId

-- 查询所有分组的结果(每个分组一行数据)
SELECT 
    c.GroupId,
    ARRAY_AGG(DISTINCT c.Location) AS Location,
    ARRAY_AGG(DISTINCT c.Status) AS Status
FROM c
GROUP BY c.GroupId

原查询写法的问题分析

  • 第一种尝试:外层FROM c WHERE c.GroupId=1会遍历每个符合条件的文档,导致子查询结果被重复返回,最终得到多条重复的聚合结果,而非单一对象。
  • 第二种尝试:子查询未添加GroupId筛选,且嵌套数组的写法错误,生成的结构不符合需求,同时没有实现去重。

内容的提问来源于stack exchange,提问作者Peter Pedigree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:25:18