arrays - 在 PostgreSQL 中查询 JSON 字段
问题描述
我的 PostgreSQL 数据库中有一个 JSON 字段,其 JSON 模式如下
{
"home":{
"lat":"37.774192",
"long":"-92.118511",
"address":"home address"
},
"work":{
"lat":"37.774192",
"long":"-92.118511",
"address":"work address"
},
"more":[
{
"id":"bRuKnd",
"name":"gym",
"lat":"37.774192",
"long":"-92.118511",
"address":"gym address"
},
{
"id":"eVdOlD",
"name":"fastfood",
"lat":"37.774192",
"long":"-92.118511",
"address":"fastfood addres"
},
{
"id":"SwkfcL",
"name":"Res",
"lat":"37.774192",
"long":"-92.118511",
"address":"Res address"
}
]
}
我可以使用此查询在“更多”或“工作”和“家庭”对象中获取每个 JSON 字段
UPDATE items FROM (SELECT loc FROM public.tbl_user where uuid = '2fa7a484-f454-4d44-94be-a4011aee47b4') as o
,json_array_elements(o.loc#>'{more}') AS items where items->>'id' = 'eVdOlD' ;
我不知道如何在我的数据库中编辑或删除这些字段
我需要这些查询
- 编辑主对象并删除其值
- 编辑工作对象并删除其值
- 在更多对象上添加编辑和删除项目
解决方案
当您在 postgres JSON 中编辑值时,您并没有像用新的东西替换行那样进行编辑。
jsonb_set 可能是您正在寻找的。
见https://www.postgresql.org/docs/current/functions-json.html
基于您的示例的更简单形式:
sophia=> create table foo (bar jsonb);
CREATE TABLE
sophia=> insert into foo values ('{
"home":{
"lat":"37.774192",
"long":"-92.118511",
"address":"home address"
}}'::jsonb);
INSERT 0 1
sophia=> select * from foo;
bar
---------------------------------------------------------------------------------
{"home": {"lat": "37.774192", "long": "-92.118511", "address": "home address"}}
(1 row)
sophia=> update foo set bar = jsonb_set(bar, '{home,address}', '"29 Acacia Road"');
UPDATE 1
sophia=> select * from foo;
bar
-----------------------------------------------------------------------------------
{"home": {"lat": "37.774192", "long": "-92.118511", "address": "29 Acacia Road"}}
(1 row)
sophia=>
同样对于删除:
sophia=> update foo set bar = jsonb_set(bar, '{home}', (bar -> 'home') - 'address');
UPDATE 1
sophia=> select * from foo;
bar
------------------------------------------------------
{"home": {"lat": "37.774192", "long": "-92.118511"}}
(1 row)
sophia=>
推荐阅读
- c++ - 在用于 BST 的类中可能有一个类成员变量 BST?
- python - TypeError:“NoneType”对象不能使用 python 进行迭代
- java - 保护源代码中的密码/字符串
- javascript - “拒绝承诺未在 1 秒内处理” vscode 扩展 API
- scala - 在 Play 应用程序中测试服务器错误处理
- python - 在 python 中排序值对,其中一对是美元格式
- android - 错误:右边框上的填充部分太多
- java - StringBuilder 或 StringBuffer 的 toString() 方法会创建一个新的不可变字符串吗?
- c# - 如果在存储过程中添加了新参数并且没有更新 ado.net 命令对象中的传递参数,如何从存储过程中删除此错误
- ios - 如何获取公共(互联网)IP 地址