Postgresql 如何按键值从PostgresJSONB中删除元素?

Postgresql 如何按键值从PostgresJSONB中删除元素?,postgresql,jsonb,postgresql-9.6,Postgresql,Jsonb,Postgresql 9.6,我有一个采用这种格式的jsonb列 { "categoryList": [{ "category_menu_id": "51", "is_featured_product": 0 }, { "category_menu_id": "54", "is_featured_product": 1 }] } 如何按类别\u菜单\u id删除类别 根据类别菜单id,此选择查询工作正常 select product_c

我有一个采用这种格式的jsonb列

{
    "categoryList": [{
        "category_menu_id": "51",
        "is_featured_product": 0
    }, {
        "category_menu_id": "54",
        "is_featured_product": 1
    }]
}
如何按类别\u菜单\u id删除类别

根据类别菜单id,此选择查询工作正常

select product_category 
from product  
where product_category->'categoryList' @> '[{"category_menu_id": "51"}]';

示例数据请注意,我添加了一个主键id以允许更新表:

create table product(id int primary key, product_category jsonb);
insert into product values
(1, 
'{
    "categoryList": [{
        "category_menu_id": "51",
        "is_featured_product": 0
    }, {
        "category_menu_id": "54",
        "is_featured_product": 1
    }]
}');
update product p
set product_category = (
    select jsonb_build_object('categoryList', jsonb_agg(value))
    from product ps,
    jsonb_array_elements(product_category->'categoryList')
    where ps.id = p.id      -- important! primary key to identify a row
    and value->>'category_menu_id' <> '51')
returning *;

 id |                             product_category                             
----+--------------------------------------------------------------------------
  1 | {"categoryList": [{"category_menu_id": "54", "is_featured_product": 1}]}
(1 row) 
此查询从json数组中跳过category_menu_id:51的元素:

select jsonb_build_object('categoryList', jsonb_agg(value))
from product,
jsonb_array_elements(product_category->'categoryList')
where value->>'category_menu_id' <> '51';

                            jsonb_build_object                            
--------------------------------------------------------------------------
 {"categoryList": [{"category_menu_id": "54", "is_featured_product": 1}]}
(1 row) 
使用上述查询更新表:

create table product(id int primary key, product_category jsonb);
insert into product values
(1, 
'{
    "categoryList": [{
        "category_menu_id": "51",
        "is_featured_product": 0
    }, {
        "category_menu_id": "54",
        "is_featured_product": 1
    }]
}');
update product p
set product_category = (
    select jsonb_build_object('categoryList', jsonb_agg(value))
    from product ps,
    jsonb_array_elements(product_category->'categoryList')
    where ps.id = p.id      -- important! primary key to identify a row
    and value->>'category_menu_id' <> '51')
returning *;

 id |                             product_category                             
----+--------------------------------------------------------------------------
  1 | {"categoryList": [{"category_menu_id": "54", "is_featured_product": 1}]}
(1 row)