首页 > 解决方案 > 更新 jsonb 列以在一个嵌套键中添加字符串列表

问题描述

我的 jsonb 列(属性)如下所示:

{
"key1" : "v1",
"key2" : "v2",
...

}

现在我需要更新此列(属性)并在列中添加以下嵌套键/值:

"Fruit":{
  "Apple":{
    "tags":[
      "color_is_green",
      "taste_good",
      "smell_like_XX"
  ]
 }
}

我想知道是否有可以直接更新此列的 postgresql 查询?

我努力了 :

UPDATE <table> 
SET 
properties = jsonb_set(properties,'{"Fruit","Apple","tags"}','"color_is_green","taste_good","smell_like_XX"');

但它给了我一个错误。

[22P02] ERROR: invalid input syntax for type json Detail: Expected end of input, but found ",". Position: 106 Where: JSON data, line 1: "obs_eng_status_faild",...

最初我们将整个属性列取出,并将其转换为 java 对象,并在 java 代码中添加/删除属性。但是现在由于 db 中有大量记录,取出所有属性并保存在内存中会导致性能问题(内存不足),他们提出了在查询中更新这些属性目录并查看是否可以节省空间的想法。

标签: postgresqljsonb

解决方案


您可以连接jsonb 值。

select 
    '{"key1" : "v1", "key2" : "v2"}':: jsonb 
    ||
    '{"Fruit": {"Apple": {"tags": ["color_is_green", "taste_good", "smell_like_XX"]}}}'::jsonb

                                                   ?column?                                                    
---------------------------------------------------------------------------------------------------------------
 {"key1": "v1", "key2": "v2", "Fruit": {"Apple": {"tags": ["color_is_green", "taste_good", "smell_like_XX"]}}}
(1 row) 

所以你可以用这种方式更新你的表:

update my_table
set properties = properties ||
    '{"Fruit": {"Apple": {"tags": ["color_is_green", "taste_good", "smell_like_XX"]}}}'::jsonb
where id = 1

但是,您应该记住,复杂的 JSON 结构会使数据处理变得困难且效率低下。


推荐阅读