You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSONiq中用group by及数组导航/拆箱移除对象重复项

基于Group By和数组拆箱的JSON去重方案

针对你给出的JSON对象:

{ "query1" : [ { "name" : "John", "id" : 1234 }, { "name" : "Rose", "id" : 3214 }, { "name" : "John", "id" : 1234 } ] }

以下是两种主流场景的实现方式:

场景1:使用JMESPath(JSON查询语言)

JMESPath原生支持group_by函数结合数组操作完成去重,表达式如下:

query1 | group_by(&id, @) | values(@) | [*][0]

分步解释:

  • query1:定位到目标数组
  • group_by(&id, @):按元素的id字段分组(若需按name+id组合作为唯一标识,可改为&[name, id]),得到以id为键、重复元素数组为值的对象
  • values(@):提取所有分组的元素数组,得到二维数组
  • [*][0]:遍历每个分组数组,取第一个元素(分组内元素均重复),最终得到去重后的一维数组

执行后结果:

[ {"name": "John", "id": 1234}, {"name": "Rose", "id": 3214} ]

场景2:使用SQL处理JSON(以PostgreSQL为例)

如果在数据库中处理这类JSON,需先拆箱数组,再通过GROUP BY去重,最后重新聚合为JSON:

SELECT json_build_object(
    'query1',
    json_agg(elem)
) AS result
FROM (
    -- 拆箱JSON数组为单行记录
    SELECT elem
    FROM jsonb_array_elements('{"query1": [{"name": "John", "id": 1234}, {"name": "Rose", "id": 3214}, {"name": "John", "id": 1234}]}'::jsonb->'query1') AS elem
    -- 按唯一标识字段分组,确保去重
    GROUP BY elem->>'id', elem->>'name'
) AS subquery;

问题排查提示:

你之前用WHERE后加GROUP BY未得到正确结果,大概率是未先拆箱JSON数组,直接对整个JSON对象分组导致的。必须先将数组拆分为单行记录,再按具体字段分组才能实现去重。

内容的提问来源于stack exchange,提问作者prav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:10:09