postgresql - 从 jsonb 数组中删除元素
问题描述
我有以下 jsonb。从数组页面中,我想删除名为“pageb”的元素。类似问题中提供的解决方案对我不起作用。
'{
"data": {
"id": "a1aldjfg3f",
"pages": [
{
"type": "pagea"
},
{
"type": "pageb"
}
],
"activity": "test"
}
}'
我的脚本现在看起来像这样。它不会返回任何错误,但不会删除元素。
UPDATE database
SET reports = jsonb_set(reports, '{data,pages}', (reports->'data'->'pages') - ('{"type":"pageb"}'), true)
WHERE reports->'data'->'pages' @> '[{"type":"pageb"}]';
解决方案
-
运算符不能在此处应用,因为右手操作数是定义键的字符串,根据文档:
从左操作数中删除键/值对或字符串元素。键/值对根据其键值进行匹配。
可以通过解包数组并找到对象的索引来从 json 数组中删除 json 对象。使用此方法的查询可能过于复杂,因此在这种情况下定义自定义函数非常方便。
create or replace function jsonb_remove_array_element(arr jsonb, element jsonb)
returns jsonb language sql immutable as $$
select arr- (
select ordinality- 1
from jsonb_array_elements(arr) with ordinality
where value = element)::int
$$;
和更新:
update my_table
set reports =
jsonb_set(
reports,
'{data,pages}',
jsonb_remove_array_element(reports->'data'->'pages', '{"type":"pageb"}')
)
where reports->'data'->'pages' @> '[{"type":"pageb"}]';
推荐阅读
- python - __future__ 语句如何知道新 Python 版本的语法?
- linux - Docker 端口映射是主机到容器还是容器到主机?
- php - 类 stdClass 的对象无法转换为字符串(Laravel 查询生成器)
- python - 风格转移:在 tensorflow 1.15.0 中保存和恢复检查点/模型
- android - Google Drive REST Android API V3 直接下载网址
- sql-server - ASP.NET Core:更新迁移时出错(数据库优先方法)
- javascript - 带列的侧边栏导航
- r - 使用霍普金斯统计评估数据集的可聚类性
- laravel - Laravel 备份命令不从控制器执行
- sql-server - SSRS - 从 SQL 格式化 datetimeoffset 值