我试图在集合中的嵌套对象中查找重复项。在旧的 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"
}
]
我尝试过的所有方法均无效,不适合在此展示。
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
是的,正如您提到的,CosmosDB 目前不支持
GROUP BY
也不支持任何其他聚合。
documentdb-lumenize
来实现分组。您将 cube.string
作为存储过程加载,然后使用聚合配置调用它。
{cubeConfig: {groupBy: "name", field: "stuff.name", f: "max"}}
这应该做你想做的事。
或者如果您想仍然使用 sql api,您可以尝试使用 Join,如答案中所述
here
我个人也面临同样的问题,但在检索具有过滤条件的记录后,我必须使用自定义逻辑进行管理。
编辑
根据下面的评论,应该是 Yes,因为您提到 CosmosDB 目前不支持
GROUP BY
我遇到了完全相同的问题。它可能不是最优雅的解决方案,但它会让您得到您想要的。基本上,查询获取 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)