如何将jsonb列转换为jsonb []列?

时间:2019-03-21 22:32:18

标签: node.js postgresql

我有一个聊天名称为“消息”的表格。每行存储一个用户的聊天统计信息,消息(如果不是很明显的话)是一个对象数组,其中包含每个消息的信息。问题是,我在完全理解Postgressql之前就创建了此列。我记得JSON可以是数组,因此我不认为在jsonb列类型后添加[]。

今天,距离这个愚蠢的错误一个月,我试图获得一个巨大的数组,用于统计目的,将所有消息组合在一起,但是意识到如果没有真正的Postgressql数组,我将很难做到这一点。

如何将该列转换为jsonb []类型?重置数据库不是一种选择。已经创建了超过200,000条消息。尝试在表格的“属性”部分中对其进行编辑时,我唯一给出的选项是“ json”和“ jsonb”。

1 个答案:

答案 0 :(得分:0)

  

出于统计目的,我试图获得所有消息的巨型数组,但意识到如果没有真正的Postgressql数组,我将很难做到这一点。

这听起来令人怀疑。我希望您希望所有消息中的。看一下jsonb_array_elements()函数。我会在下面按照您的要求使用它。

-- setup
CREATE TABLE chat (id int, messages jsonb);

INSERT INTO chat VAlUES
  (1, '[{"some":"content"},{"more":"stuff"}]'),
  (2, '["maybe","this"]');

-- solution
BEGIN;
ALTER TABLE chat RENAME messages TO messages_old;
ALTER TABLE chat ADD messages jsonb[];

UPDATE chat
  SET messages = (SELECT array_agg(m) FROM jsonb_array_elements(messages_old) m);

ALTER TABLE chat
  ALTER messages SET NOT NULL,
  DROP messages_old;
COMMIT;

-- result
SELECT * FROM chat;
/*
 id |                      messages                       
----+-----------------------------------------------------
  1 | {"{\"some\": \"content\"}","{\"more\": \"stuff\"}"}
  2 | {"\"maybe\"","\"this\""}
(2 rows)
*/