【问题标题】:How to query Cosmos DB to have an array from multiple items in the result set如何查询 Cosmos DB 以获取来自结果集中多个项目的数组
【发布时间】:2020-12-08 22:05:18
【问题描述】:

我在一个容器中有以下内容,其中device_id是分区键。

[
    {
        "id": "hub-01",
        "device_id": "device-01",
        "created": "2020-12-08T17:47:35",
        "cohort": "test"
    },
    {
        "id": "hub-02",
        "device_id": "device-01",
        "created": "2020-12-08T17:47:36",
        "cohort": "test"
    },
    {
        "id": "hub-01",
        "device_id": "device-02",
        "created": "2020-11-17T20:25:20",
        "cohort": "test"
    },
    {
        "id": "hub-01",
        "device_id": "device-03",
        "created": "2020-11-17T16:05:18",
        "cohort": "test"
    }
]

如何查询所有唯一设备,并将其所有元数据收集到一个子列表中,因此我得到以下结果集:

[
    {
        "device_id": "device-01",
        "hubs": [
            {
                "id": "hub-01",
                "created": "2020-12-08T17:47:35",
                "cohort": "test"
            },
            {
                "id": "hub-02",
                "created": "2020-12-08T17:47:36",
                "cohort": "test"
            }
        ]
    },
    {
        "device_id": "device-02",
        "hubs": [
            {
                "id": "hub-01",
                "created": "2020-11-17T20:25:20",
                "cohort": "test"
            }
        ]
    },
    {
        "device_id": "device-03",
        "hubs": [
            {
                "id": "hub-01",
                "created": "2020-11-17T16:05:18",
                "cohort": "test"
            }
        ]
    }
]

我正在按照以下子查询的方式进行试验,但它的行为与我预期的不同:

SELECT
    DISTINCT c.device_id,
    ARRAY(
        SELECT
            c2.id,
            c2.created,
            c2.cohort
        FROM c AS c2
        WHERE c2.device_id = c.device_id
    ) as hubs
FROM c

【问题讨论】:

  • AFAIK 不支持这种分组,因此您需要在客户端进行数据转换。

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

您可以创建 UDF 函数来处理此问题。 这是我在另一篇文章中回答的类似问题。 group data by same timestamp using cosmos db sql

【讨论】:

    【解决方案2】:

    我同意 Mo B 的观点。您需要在客户端处理此问题。我不认为 UDF 函数可以处理这个问题,因为 UDF 函数不能将多个项目合并为一个。我认为最接近的 SQL 是这样的:

    SELECT
        c2.device_id,ARRAY_CONCAT([],c2.hubs)
    FROM 
    (SELECT c.device_id,ARRAY(
            SELECT
                c.id,
                c.created,
                c.cohort
            FROM c
        ) as hubs FROM c) as c2
    GROUP BY c2.device_id
    

    但是 ARRAY_CONCAT 不是聚合函数,也没有聚合函数可以连接数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 2020-07-05
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多