【发布时间】:2019-08-30 19:06:15
【问题描述】:
我有一张这样的桌子:
id: integer,
... other stuff...,
comments: array of jsonb
其中 cmets 列具有以下结构:
[{
"uid": "comment_1",
"message": "level 1 - comment 1",
"comments": [{
"uid": "subcomment_1",
"message": "level 2 - comment 1",
"comments": []
}, {
"uid": "subcomment_2",
"message": "level 1 - comment 2",
"comments": []
}]
},
{
"uid": "P7D1hbRq4",
"message": "level 1 - comment 2",
"comments": []
}
]
我需要更新一个特定的字段,例如:comments[1](with uid = comment_1) -> comments[2] (with uid = subcomment_2) -> message = 'comment edited'。
我是 postgresql 的新手,我无法弄清楚如何做到这一点,甚至没有接近。我设法合并对象并更改级别 1 的消息:
UPDATE tasks
set comments[1] = comments[1]::jsonb || $$
{
"message": "something",
}$$::jsonb
where id = 20;
但这是我能做到的。
对正确方向的任何提示?
乐: 我已经走到这一步了:
UPDATE tasks
set comments[1] = jsonb_set(comments[1], '{comments,1, message}', '"test_new"')
where id = 20;
当然,我可以从 javascript 获得这条路径,但这是最佳实践吗?使用 javascript 数组中的索引感觉不舒服。 我应该尝试编写一个 sql 函数来获取数组并使用“uid”作为键吗?还有其他更简单的使用“uid”搜索/选择的方法吗?
LLE
我无法通过this question 的建议让它工作(我阅读并尝试过) 下面的代码什么也不返回:
-- get index for level 2
select pos as elem_index
from tasks,
jsonb_array_elements(comments[0]->'comments') with ordinality arr(elem, pos)
where tasks.id = 20 and
elem ->>'uid'='subcomment_1';
而且我需要它的几个级别,所以它不是完全重复的。
【问题讨论】:
-
postgresql.org/docs/11/functions-json.html,jsonb_set 可以帮到你
-
查看 LE,因为我无法在此处粘贴代码
标签: postgresql jsonb postgresql-11