postgresql - Postgres:更新 JSON 数组并删除与键匹配的元素
问题描述
鉴于下表
drop table if exists documents;
create table documents(docu_id text, attachments jsonb);
insert into documents values
('001',
'[{"province":"test province","city":"test city","barangay":"test barangay,"street":"test ST"},
{"province":"test province 2","city":"test city 2","barangay":"test barangay 2","street":"test street 2"}]'
),
('002',
'[{"province":"test province 2 1":"VALENZUELA CITY","test barangay 2 1":"test barangay 2 1","street":"test street 2 1"},
{"province":"test province 2 2","city":"test city 2 2","barangay":"test barangay 2 2","street":"test strett 2 2"}]'
);
我如何更新匹配街道关键词的 json 数组:test ST
预期产出
[{"province":"test province 2","city":"test city 2","barangay":"test barangay 2","street":"test street 2"}]
[{"province":"test province 2 1":"VALENZUELA CITY","test barangay 2 1":"test barangay 2 1","street":"test street 2 1"},
{"province":"test province 2 2","city":"test city 2 2","barangay":"test barangay 2 2","street":"test strett 2 2"}]
解决方案
SELECT
docu_id,
jsonb_agg(elements.value) -- 3
FROM
documents,
jsonb_array_elements(attachments) AS elements -- 1
WHERE elements ->> 'street' != 'test ST' -- 2
GROUP BY docu_id -- 3
- 将数组元素展开为一行
jsonb_array_elements()
- 按您喜欢的方式过滤这些元素
- 使用聚合函数将剩余元素再次分组到 JSON 数组中
jsonb_agg()
更新:
UPDATE documents d
SET attachments = s.new_attachments
FROM (
SELECT
docu_id,
jsonb_agg(elements.value) AS new_attachments
FROM
documents,
jsonb_array_elements(attachments) AS elements
WHERE elements.value ->> 'street' != 'test ST'
GROUP BY docu_id
) s
WHERE d.docu_id = s.docu_id
推荐阅读
- mongodb - XML 格式的 Doctrine ODM 捆绑文档映射
- ios - 如何防止 UITableViewCell 在部分刷新时丢失其选择状态?
- ios - Apple 订阅 - 如何正确配置沙盒
- java - Java - 如何禁用 SSL 认证验证
- javascript - Ajax 页面更改上的 Javascript 变量“未清除”
- javascript - Wordpress - ACF:在非管理员用户的用户配置文件中禁用转发器字段
- c++ - 获取与 int、float 等字符串对应的类型
- c++ - 使用其中的所有 QGraphicsItem 调整 QGraphicsScene 的大小
- node.js - npm 脚本一次运行 redis-server、mongod 和 nodemon
- android - 将数组减少为单个整数会导致类型错误