如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组

Posted

技术标签:

【中文标题】如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组【英文标题】:How to push a JSON object to a array in jsonb column in postgresql 【发布时间】: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"
          
      ]
    此结构存储在 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"
          
      ]
    请告诉我根据 id 删除对象的任何方法....

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

【问题讨论】:

你的 postgres 版本是什么?.. postgres的版本是PostgreSQL 9.6.1 .thanks 【参考方案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

以上是关于如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何以角度将数组推送到 JSON 对象

Angular,将 JSON 对象推送到服务器

将 JSON 对象推送到 localStorage 中的数组

如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?

如何将 Json 数据推送到 UITableView 中的标签?

如何将 JSON 数据发布到 PubSub,然后推送到 BigQuery?