Postgres:从匿名jsonb数组元素中删除对象

Posted

技术标签:

【中文标题】Postgres:从匿名jsonb数组元素中删除对象【英文标题】:Postgres: Delete object from anonymous jsonb array element 【发布时间】:2018-08-29 18:20:21 【问题描述】:

我有一个包含 2 个字段的表格:

table documents
  docu_id     uuid
  attachments jsonb

attachments jsonb 列的示例数据为:

[
 
    "size": 10,
    "attach_id": "d3a21f904068"
 ,
    "Size": 0.143,
    "attach_id": "5ba4b285565b"
 
]

我已经看到很多关于如何根据字段名称更新/删除 jsonb 的示例,但是是否可以从 匿名数组 中删除 匿名对象 其中@ 987654324@

delete from documents
  where docu_id = "Y" 
    and
    where attachments @> '["attach_id": "X"]'

【问题讨论】:

您想从表格中删除整个行吗?还是只是数组中的一个元素? @a_horse_with_no_name 只是数组中的元素。从附件 jsonb 数组中删除 attach_id = "X" 【参考方案1】:

好的,找到了解决方案,所以我在这里分享它,(rextester链接http://rextester.com/YICZ86369):

插入数据

  create table documents(docu_id text, attachments jsonb);
    insert into documents values
    ('001', 
    '[
      
        "name": "uno",
        "id":"1"
      ,
       
        "name": "dos",
        "id":"2"
      ,
       
        "name": "tres",
        "id":"3"
      
    ]'
    ),
    ('002', 
    '[
      
        "name": "eins",
        "id":"1"
      ,
       
        "name": "zwei",
        "id":"2"
      
    ]'
    );
    select * from documents;

解决办法

UPDATE documents
   SET attachments = attachments #- 
          array(
                    SELECT i
                      FROM generate_series(0, jsonb_array_length(attachments) - 1) AS i
                      WHERE (attachments->i->'id' = '"2"')
           )::text[] /* cast as text */
       where docu_id = '002';

select * from documents;

【讨论】:

以上是关于Postgres:从匿名jsonb数组元素中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

从 postgres 表中提取 json 数组给出错误:无法从标量中提取元素

Postgres:在递归合并函数中删除 jsonb 键

从对象 JSONB 中的数组中删除元素

如何仅从 postgres 获取特定键的 jsonb?

在 Postgres 中优化 jsonb 数组值的 GROUP BY

Postgres 数组列与 JSONB 列