如何在Cosmos DB中不使用GROUP BY和COUNT查找嵌套数组重复项
解决Cosmos DB嵌套数组重复项筛选问题
我懂你这种头疼的感觉——在Cosmos DB里想找嵌套数组里的重复项,传统SQL那套GROUP BY加COUNT的路子根本走不通,而且还只能用Azure门户的数据资源管理器来操作。别着急,我给你两个实用的方案,都是能直接在数据资源管理器里跑的:
方案一:快速筛选存在重复项的文档
这个方法的核心思路是对比原数组和去重后数组的长度——如果原数组长度大于去重后的长度,就说明里面有重复元素。
直接用下面的查询语句(记得把YourCollection换成你的集合名称,stuff换成你的嵌套数组字段名):
SELECT c.id, c.stuff FROM c WHERE ARRAY_LENGTH(c.stuff) > ARRAY_LENGTH(ARRAY_DISTINCT(c.stuff))
解释:
ARRAY_DISTINCT(c.stuff)会返回一个去掉了重复元素的新数组- 当原数组的长度比去重后的数组长时,就证明该文档的
stuff数组存在重复项,会被筛选出来
方案二:找出具体重复的元素及次数
如果你不仅要知道哪些文档有重复,还想看到具体是哪个元素重复了、重复了多少次,可以用JOIN结合分组查询:
SELECT c.id, duplicateItem, COUNT(1) AS duplicateCount FROM c JOIN item IN c.stuff GROUP BY c.id, item HAVING COUNT(1) > 1
解释:
JOIN item IN c.stuff会把数组里的每个元素拆分成单独的行- 按文档
id和数组元素item分组后,用COUNT(1)统计每个元素的出现次数 HAVING COUNT(1) > 1会筛选出出现次数超过1次的元素,也就是重复项
针对复杂对象数组的调整
如果你的stuff数组里不是简单值,而是复杂对象(比如{"name": "apple", "price": 5}),想要基于对象的某个属性找重复,可以修改分组字段:
SELECT c.id, item.name, COUNT(1) AS duplicateCount FROM c JOIN item IN c.stuff GROUP BY c.id, item.name HAVING COUNT(1) > 1
这个查询会找出每个文档中name属性重复的对象,并统计重复次数。
内容的提问来源于stack exchange,提问作者AlexW-3891
相关产品推荐
相关产品推荐

