如何在没有GROUP BY和COUNT的cosmos db中的嵌套数组中查找重复项

时间:2018-05-29 14:20:34

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我试图在集合中的嵌套对象中找到重复项。在你的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"
    } 
] 

我所尝试过的任何内容都没有效果,并且不适合在这里展示。

2 个答案:

答案 0 :(得分:1)

是的,正如您所提到的,CosmosDB目前不支持 GROUP BY ,也不支持任何其他聚合。

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

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

应该做你想做的事。

或者如果您仍想使用sql api,可以尝试使用Join,如答案 here

中所述

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

修改

根据下面的评论,它应该是,因为您提到CosmosDB目前不支持 GROUP BY ,也不支持任何其他聚合

答案 1 :(得分:0)

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://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-subquery

P.S。此外,Cosmos db现在支持分组依据 https://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-group-by