当前位置: 首页 > 知识库问答 >
问题:

JSONB到数组数据类型

洪经义
2023-03-14

我目前有一个表会话和一个列操作(JSONB)。

我能够使用array_to_jsonb(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;
select session_id, jsonb_array_elements_text(actions)
from sessions
group by session_id;

结果是(只关注264的session_id的结果):查询结果

现在,我在它们自己的行中有对象,如下所示:

 {"name": "some task", "check": "false} 

当我希望操作列的内容是:

[ {name: "some task", check: false}, {name: "other task", check: true} ]
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;

获取文本值,然后对那些返回的行应用聚合函数。只是无法使select array_agg(doc)按预期工作。很可能是因为我在那个地方需要一个不同的功能。

共有1个答案

卫才
2023-03-14

这有帮助吗?

演示:DB<>Fiddle

SELECT
    jsonb_agg(elem) 
FROM
    sessions, jsonb_array_elements(actions) as elem
  1. jsonb_array_elements()jsonb数组扩展为每一行jsonb元素
  2. jsonb_agg()将这些jsonb元素聚合到一个大数组中。
 类似资料:
  • 本文向大家介绍介绍PostgreSQL中的jsonb数据类型,包括了介绍PostgreSQL中的jsonb数据类型的使用技巧和注意事项,需要的朋友参考一下 PostgreSQL 9.4 正在加载一项新功能叫jsonb,是一种新型资料,可以储存支援GIN索引的JSON 资料。换言之,此功能,在即将来临的更新中最重要的是,如果连这都不重要的话,那就把Postgres 置于文件为本数据库系统的推荐位置吧

  • 背景:我们使用书面记录来记录我们不断变化的模型的历史。现在我想查询一个属于某个客户的项目。PaperTrail可选择存储对象更改,我需要查询此字段以了解何时使用此ID创建了某些内容或更改为此ID。 我的表看起来简化如下: 如何查询从或更改为ID 5的元素(因此上面的所有行)?我试过: 这让我:

  • 问题内容: 我没有找到使用JPA(EclipseLink)从PostgreSQL映射JSON和JSONB数据类型的方法。是否有人将这种数据类型与JPA结合使用,可以给我一些工作示例吗? 问题答案: 所有的答案都帮助我达成了最终的解决方案,该解决方案可以用于JPA,而不是专门用于EclipseLink或Hibernate。

  • 我想存储一个大的json散列(或内容,按您的意思来称呼它),我所说的“大”是指超过1000个键值对的东西,我不想对这个json字段进行任何搜索,我只想从数据库中检索它,并将它传递给javascript来解析它并构造一个可视化结果。

  • 我正在尝试将以下内容与spring-data-jdbc和postgres驱动程序(kotlin)一起使用, 使用字符串失败,出现以下错误, 我不知道如何使用字符串转换器-

  • 问题内容: 我有一个json数组,其中包含大约1000个结构为“ oid:aaa,instance:bbb,value:ccc”的元素。 并且每个json数组都是唯一的。如果可以更改结构,可以将格式更改为 key:value : 但是,如果我需要保留旧结构 从阵列中获取特定信息的最快方法是什么? 什么是得到一个表的3列最快的方式,和。甚至更好的是将oid + instance作为列标题的数据透视表