如何在不使用 GROUP BY 和 COUNT 的情况下在 cosmos db 中的嵌套数组中查找重复项

问题描述 投票:0回答:3

我试图在集合中的嵌套对象中查找重复项。在旧的 SQL 中,我会使用某种 GROUP BY 和 COUNT 来完成此操作。 Cosmos DB 不支持 GROUP BY (据我所知),所以我正在尝试找到解决方法。一个限制是我只能访问 azure 门户中的数据浏览器(不要问)。

为了更详细地解释,假设您有一个如下所示的集合。请注意,第一项在“stuff”集合中有重复项:

[
    {
        "id": "1",
        "Name": "Item with duplicate stuff",
        "stuff" : [
            {
                "name" : "A",
            },
            {
                "name" : "B",
            },
            {
                "name" : "A"
            }  
        ]
    },
    {
        "id": "2",
        "Name": "Item with unique stuff",
        "stuff" : [
            {
                "name" : "A",
            },
            {
                "name" : "B",
            },
            {
                "name" : "C"
            }  
        ]
    }    

我想找到我的集合中在“stuff”属性中具有重复项的所有项目。因此在这种情况下它将返回 id 为“1”的项目。像这样的事情会很好:

[
    {
        "id": "1"
    } 
] 

我尝试过的所有方法均无效,不适合在此展示。

azure azure-cosmosdb azure-cosmosdb-sqlapi
3个回答
2
投票

Cosmos db 支持子查询和 DISTINCT 关键字。所以,像这样的东西应该有效

  SELECT n2
    FROM c
    JOIN (SELECT DISTINCT value s.name FROM s IN c['stuff'])  n2

第一项的结果

[
    {
        "n2": "A"
    },
    {
        "n2": "B"
    },
    {
        "n2": "C"
    }
]

参考: https://learn.microsoft.com/en-gb/azure/cosmos-db/sql-query-subquery

附注此外,Cosmos db 现在支持 Group By https://learn.microsoft.com/en-gb/azure/cosmos-db/sql-query-group-by


1
投票

是的,正如您提到的,CosmosDB 目前不支持

GROUP BY
也不支持任何其他聚合。

但是,您可以使用

documentdb-lumenize
来实现分组。您将
cube.string
作为存储过程加载,然后使用聚合配置调用它。

{cubeConfig: {groupBy: "name", field: "stuff.name", f: "max"}}

这应该做你想做的事。

或者如果您想仍然使用 sql api,您可以尝试使用 Join,如答案中所述

here

我个人也面临同样的问题,但在检索具有过滤条件的记录后,我必须使用自定义逻辑进行管理。

编辑

根据下面的评论,应该是 Yes,因为您提到 CosmosDB 目前不支持

GROUP BY
也不支持任何其他聚合


0
投票

我遇到了完全相同的问题。它可能不是最优雅的解决方案,但它会让您得到您想要的。基本上,查询获取 c["stuff"] 中的计数和非重复计数,比较两个计数,然后最终显示计数和非重复计数不相同的记录的 id。

SELECT 
    d.id
FROM
(
    SELECT c.id,
    (SELECT VALUE COUNT(f.name) FROM f IN c["stuff"]) totalCount,
    ARRAY(SELECT DISTINCT VALUE f.name FROM f IN c["stuff"]) noDupArray
    FROM c
) d
WHERE 
    d.totalCount <> (SELECT VALUE COUNT(1) FROM f IN d.noDupArray)
© www.soinside.com 2019 - 2024. All rights reserved.