我有一个聊天名称为“消息”的表格。每行存储一个用户的聊天统计信息,消息(如果不是很明显的话)是一个对象数组,其中包含每个消息的信息。问题是,我在完全理解Postgressql之前就创建了此列。我记得JSON可以是数组,因此我不认为在jsonb列类型后添加[]。
今天,距离这个愚蠢的错误一个月,我试图获得一个巨大的数组,用于统计目的,将所有消息组合在一起,但是意识到如果没有真正的Postgressql数组,我将很难做到这一点。
如何将该列转换为jsonb []类型?重置数据库不是一种选择。已经创建了超过200,000条消息。尝试在表格的“属性”部分中对其进行编辑时,我唯一给出的选项是“ json”和“ jsonb”。
答案 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)
*/