我目前有一张名为sessions的表格,其中有一个名为actions的列(JSONB)。
我能够使用array_to_jsonb(array value)
将来自我的前端的数组正确地存储到我的数据库中。
我的数组结构(array value)如下:
var arrayStructure = [
{name: 'email client', check: false},
{name: 'send contract', check: false}
]
与我在SO上看到的大多数关于修改JSONB或访问某些键的问题不同,我只对将整个JSONB数据转换回前端数组感兴趣。
我的临时解决方案是通过数组映射并在Javascript中使用JSON.parse()来重构数组中的每个对象。我无法在整个数组上使用JSON.parse(),因为它会抛出错误。
我正在寻找一个查询,以将数组格式带回存储的JSONB数据类型。我已经看过了JSONB_SET、LATERAL和JSONB_ARRAY_ELEMENTS_TEXT。但没有一种方法可以有效地将其转换成正确的数组。
开始为:名为sessions的表中的actions列中的JSONB
应返回结果:一个查询,带回所有行,但是将actions列(JSONB)转换回前端数组:
select session_id, session_name, someFunction or lateral here(actions) from sessions
我尝试过类似这样的查询:
SELECT
session_id,
actions::jsonb -> 'name' as name
FROM sessions;
我尝试获取name,结果却返回null。我已经试过访问更深层次的内容,但是也没用。
以下是正确查询结果的一部分:
select session_id, jsonb_array_elements_text(actions)
from sessions
group by session_id;
以下是结果(只关注session_id为264的结果):
查询结果现在我已经将对象放在它们自己的行中:
{"name": "some task", "check": "false}
当我想要的动作列是:
[ {name: "some task", check: false}, {name: "other task", check: true} ]
我需要进一步解析JSON并按session_id分组。 我只是在努力构建一个能够实现此功能的子查询。
创建设置步骤:
create table fakeSessions (
session_id serial primary key,
name varchar(20),
list jsonb
)
insert into fakeSessions(name, list)
VALUES(
'running',
'["{\"name\":\"inquired\",\"check\":false}", "{\"name\":\"sent online guide\",\"check\":false}", "{\"name\":\"booked!\",\"check\":false}"]'
)
insert into fakeSessions(name, list)
VALUES(
'snowboarding',
'["{\"name\":\"rental\",\"check\":false}", "{\"name\":\"booked ski passes\",\"check\":false}", "{\"name\":\"survey\",\"check\":false}"]'
)
我创建的最接近的查询:
with exports as (
select jsonb_array_elements_text(actions)::jsonb as doc from sessions
)
select array_agg(doc) from
exports, sessions
group by session_id;
获取文本值,然后对返回的行应用聚合函数。只是无法将选择的array_agg(doc)按预期工作。最有可能是因为我需要在那个位置使用不同的函数。