首页 > 解决方案 > 从 jsonb 数组中删除元素

问题描述

我有以下 jsonb。从数组页面中,我想删除名为“pageb”的元素。类似问题中提供的解决方案对我不起作用。

'{
  "data": {
    "id": "a1aldjfg3f",
    "pages": [
      {
        "type": "pagea"
      },
      {
        "type": "pageb"
      }                                
    ],
    "activity": "test"
  }
}'

我的脚本现在看起来像这样。它不会返回任何错误,但不会删除元素。

  UPDATE database
  SET reports = jsonb_set(reports, '{data,pages}', (reports->'data'->'pages') - ('{"type":"pageb"}'), true)
  WHERE reports->'data'->'pages'  @> '[{"type":"pageb"}]';

标签: postgresqljsonb

解决方案


-运算符不能在此处应用,因为右手操作数是定义键的字符串,根据文档:

从左操作数中删除键/值对或字符串元素。键/值对根据其键值进行匹配。

可以通过解包数组并找到对象的索引来从 json 数组中删除 json 对象。使用此方法的查询可能过于复杂,因此在这种情况下定义自定义函数非常方便。

create or replace function jsonb_remove_array_element(arr jsonb, element jsonb)
returns jsonb language sql immutable as $$
    select arr- (
        select ordinality- 1
        from jsonb_array_elements(arr) with ordinality
        where value = element)::int
$$;

和更新:

update my_table
set reports = 
    jsonb_set(
        reports, 
        '{data,pages}', 
        jsonb_remove_array_element(reports->'data'->'pages', '{"type":"pageb"}')
        )
where reports->'data'->'pages'  @> '[{"type":"pageb"}]';

rextester 中的工作示例。


推荐阅读