如何将 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 对象推送到 localStorage 中的数组
如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?