【问题标题】:How to push a JSON object to a array in jsonb column in postgresql如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组
【发布时间】:2017-05-03 06:09:15
【问题描述】:

我是在 postgresql 中使用 jsonb 的新手。

I have a following structure 

      [
          {
              "Id":1,
              "Name":"Emilia"
          },
          {
              "Id":2,
              "Name":"sophia"
          },
          {
              "Id":3,
              "Name":"Anna"
          },
          {
              "Id":4,
              "Name":"Marjoe"
          }
      ]
  1. 此结构存储在 jsonb 列(项目)中。我需要在此数组中附加 {"Id":5,"Name":"Linquin"}。并将其设置回 jsonb 列项目。

我需要这样的东西。

     [
          {
              "Id":1,
              "Name":"Emilia"
          },
          {
              "Id":2,
              "Name":"sophia"
          },
          {
              "Id":3,
              "Name":"Anna"
          },
          {
              "Id":4,
              "Name":"Marjoe"
          },
          {
              "Id":5,
              "Name":"Linquin"
          }
      ]
  1. 请告诉我根据 id 删除对象的任何方法....

感谢任何帮助。谢谢...

【问题讨论】:

  • 你的 postgres 版本是什么?..
  • postgres的版本是PostgreSQL 9.6.1 .thanks

标签: postgresql append jsonb


【解决方案1】:

使用连接运算符 ||将元素附加到数组:

UPDATE s101
SET j = j || '{"Id":5,"Name":"Linquin"}'::jsonb
WHERE id = 1;

【讨论】:

    【解决方案2】:

    要向jsonb 数组添加新元素,正如@VaoTsun 所说,您可以使用连接

    select j||'{"Id":5,"Name":"Linquin"}'::jsonb as newjosn   from (
        select '[
          {
              "Id":1,
              "Name":"Emilia"
          },
          {
              "Id":2,
              "Name":"sophia"
          },
          {
              "Id":3,
              "Name":"Anna"
          },
          {
              "Id":4,
              "Name":"Marjoe"
          }
        ]'::jsonb as j
    ) t
    

    基于 id 删除元素,一种方法是:(例如删除 id=2 的元素)

    select to_jsonb(array_agg(lst)) as newjson from (
        select  jsonb_array_elements('[
          {
              "Id":1,
              "Name":"Emilia"
          },
          {
              "Id":2,
              "Name":"sophia"
          },
          {
              "Id":3,
              "Name":"Anna"
          },
          {
              "Id":4,
              "Name":"Marjoe"
          }
        ]'::jsonb) as lst
    ) t
    where lst->'Id' <> '2'
    

    所以,这个方法只是获取所有json数组值作为json元素的记录,然后选择除元素之外的所有元素id=2,然后从选定的记录中再次制作json数组。

    注意,如果你真的需要更新列,那么这个方法要求表应该有唯一/标识列(通常是id列),因为每个json数组都应该按自己的id列分组。 (不要将此 id 与您的 json 数组 Id 字段混合)。

    【讨论】:

      【解决方案3】:

      这是适用于版本 >= 9.5 (9.4 method was introduced here earlier) 的答案

      要更新jsonb值,你需要运行update set column = new_value where ...

      如果你知道确切的索引,你可以使用jsonb_set来构造新值

      ,或者只是 || 运算符:

      t=# select jsonb_set(j,'{5}','{"Id":5, "Name":"x"}'),j||'{"Id":5, "Name":"x"}' from s101;
      -[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------------------
      jsonb_set | [{"Id": 1, "Name": "Emilia"}, {"Id": 2, "Name": "sophia"}, {"Id": 3, "Name": "Anna"}, {"Id": 4, "Name": "Marjoe"}, {"Id": 5, "Name": "x"}]
      ?column?  | [{"Id": 1, "Name": "Emilia"}, {"Id": 2, "Name": "sophia"}, {"Id": 3, "Name": "Anna"}, {"Id": 4, "Name": "Marjoe"}, {"Id": 5, "Name": "x"}]
      

      删除数组项使用-(假设Id键是准确的,你应该使用Id-1数学来获取索引):

      t=# select j - 3 from s101;
      -[ RECORD 1 ]-----------------------------------------------------------------------------------
      ?column? | [{"Id": 1, "Name": "Emilia"}, {"Id": 2, "Name": "sophia"}, {"Id": 3, "Name": "Anna"}]
      

      我的示例构建:

      t=# create table s101(j jsonb);
      CREATE TABLE
      Time: 37.734 ms
      t=# insert into s101 select  ' [
      t'#           {
      t'#               "Id":1,
      t'#               "Name":"Emilia"
      t'#           },
      t'#           {
      t'#               "Id":2,
      t'#               "Name":"sophia"
      t'#           },
      t'#           {
      t'#               "Id":3,
      t'#               "Name":"Anna"
      t'#           },
      t'#           {
      t'#               "Id":4,
      t'#               "Name":"Marjoe"
      t'#           }
      t'#       ]'::jsonb;
      INSERT 0 1
      Time: 1.070 ms
      

      【讨论】:

      • 如果我知道要追加的索引,这可以工作。如果我不知道索引怎么办。怎么做。jsonb_set 方法里面有什么??如果我只想删除第 3 个对象但我需要保留第 4 个对象,那么删除怎么办。谢谢....
      • 无索引追加,使用'||' - 它在答案中。要仅删除第 3 个,请按照答案 (Id-1) 中的公式使用 jsonb_col - 2
      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多