我有一张像这样的桌子:
id: integer,
... other stuff...,
comments: array of jsonb
其中comment列具有以下结构:
[{
"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;
但这是我所能做到的。
对正确方向有任何暗示吗?
LE:我走了这么远:
UPDATE tasks
set comments[1] = jsonb_set(comments[1], '{comments,1, message}', '"test_new"')
where id = 20;
当然,我可以从javascript获取此路径,但这是最佳实践吗?使用javascript数组的索引感到不舒服。我是否应该尝试编写一个sql函数来获取数组并将'uid'用作键?还有其他使用'uid'进行搜索/选择的更简单方法吗?
乐乐
我在以下位置使用建议无法正常工作:这个问题(我已阅读并尝试过)以下代码未返回任何内容:
-- 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';
而且我需要几个级别,所以它不是重复的。
首先,您不能更新列的一部分(数组的元素),而只能更新整个列。
接下来,您应该了解路径(jsonb_set()
函数的第二个参数)的含义。
最后,该函数的第三个参数是有效的json,因此必须在单引号和双引号中都包含一个简单的文本值。
update tasks
set comments = jsonb_set(comments, '{0, comments, 1, message}', '"comment edited"')
where id = 1;
路径:
comments
comments
数组的第二个元素message
上面元素中的对象。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句