postgresql - 更新 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 中有大量记录,取出所有属性并保存在内存中会导致性能问题(内存不足),他们提出了在查询中更新这些属性目录并查看是否可以节省空间的想法。
解决方案
您可以连接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 结构会使数据处理变得困难且效率低下。
推荐阅读
- go - go build 的奇怪行为 cmd/
- powershell - 尝试从自定义路径加载 PowerShell 模块
- kubernetes - 外部服务的 Kubernetes 入口规则(具有 ExternalName 类型)
- javascript - 如何避免javascript中的异步函数?
- reactjs - 使用 React.useMemo 进行异步调用
- c# - Asp Identity 导航属性
- django - ReactJS 和 Django axios.post(403 错误代码)
- jmeter - 你能告诉我 Jmeter 中 Min、Max、Throughput 和 Deviation 的标准值吗
- javascript - ReferenceError:计时器未在 Timeout._onTimeout 处定义
- python - 无法将 python pip 安装到 docker 容器