2017-08-28 104 views
0

我想從我的postgres後端構建一個使用對象。有問題的表格看起來像這樣:如何從非JSONB postgres表加載數據作爲嵌套的JSONB

我們有一些東西基本上充當矩陣的行,其中的列是Field_Columns。 Field_Values是填充的單元格。

Create Table Platform_User (
    serial id PRIMARY KEY 
) 

Create Table Things (
    serial id PRIMARY KEY, 
    INTEGER user_id REFERENCES Platform_User(id) 
) 

Create Table Field_Columns (
    serial id PRIMARY KEY, 
    TEXT name, 
) 

Create Table Field_Values (
    INTEGER field_column_id REFERENCES Field_Columns(id), 
    INTEGER thing_id REFERENCES Things(id) 
    TEXT content, 
    PRIMARY_KEY(field_column_id, thing_id) 
) 

這將是簡單的,如果我試圖加載只是Field_Values爲一個單一的東西爲JSON,這將是這樣的:

SELECT JSONB_OBJECT(
    ARRAY(
     SELECT name 
     FROM Field_Columns 
     ORDER BY Field_Columns.id 
    ), 
    ARRAY(
     SELECT Field_Values.content 
     FROM Fields_Columns 
     LEFT JOIN Field_Values ON Field_Values.field_column_id = Field_Columns.id 
      AND Field_Values.thing_id = Things.id 
     ORDER BY Field_Columns.id) 
    ) 
) 
FROM Things 
WHERE Thing.id = $1 
然而

,我想構建JSON對象在返回時看起來像這樣。我想獲得的所有字段的對象:對的事情,用戶擁有

{ 
    14: 
     { 
      'first field':'asdf', 
      'other field':'' 
     } 
    25: 
     { 
      'first field':'qwer', 
      'other field':'dfgdsfg' 
     } 
    43: 
     { 
      'first field':'', 
      'other field':'' 
     } 
} 

我的努力來構建該查詢這個樣子的Field_Values的對象,但我遇到了這個問題,其中JSONB目標函數不希望構造一個對象,其中字段的值是一個對象本身

SELECT (
    JSONB_OBJECT(
     ARRAY(SELECT Things.id::TEXT 
      FROM Things 
      WHERE Things.user_id = $2 
      ORDER BY Things.id 
     ), 

     ARRAY(SELECT JSONB_OBJECT(
      ARRAY(
       SELECT name 
       FROM Field_Columns 
       ORDER BY Field_Columns.id), 
      ARRAY(
       SELECT Field_Values.content 
       FROM Field_Columns 
       LEFT JOIN Field_Values ON Field_Values.field_column_Id = Field_Columns.id 
        AND Field_Values.thing_id = Things.id 
       ORDER BY Field_Columns.id) 
      ) 
      FROM Things 
      WHERE Things.user_id = $2 
      ORDER BY Things.id 
     ) 
    ) 
) AS thing_fields 

特定的錯誤我得到的是功能jsonb_object(文本[],jsonb [])不存在。有沒有辦法做到這一點,不涉及大量的文字轉換和廢話呢?或者我只需要放棄嘗試在查詢中對數據進行排序,而不是在我的代碼中執行。

回答

0

你的DDL腳本語法不正確,所以我創建這些你:

create table platform_users (
    id int8 PRIMARY KEY 
); 
create table things (
    id int8 PRIMARY KEY, 
    user_id int8 REFERENCES platform_users(id) 
); 
create table field_columns (
    id int8 PRIMARY KEY, 
    name text 
); 
create table field_values (
    field_column_id int8 REFERENCES field_columns(id), 
    thing_id int8 REFERENCES things(id), 
    content text, 
    PRIMARY KEY(field_column_id, thing_id) 
); 

我也創造了一些腳本來填充數據庫:

insert into platform_users(id) values (1); 
insert into platform_users(id) values (2); 
insert into platform_users(id) values (3); 
insert into platform_users(id) values (4); 
insert into platform_users(id) values (5); 

insert into things(id, user_id) values(1, 1); 
insert into things(id, user_id) values(2, 1); 
insert into things(id, user_id) values(3, 2); 
insert into things(id, user_id) values(4, 2); 

insert into field_columns(id, name) values(1, 'col1'); 

insert into field_columns(id, name) values(2, 'col2'); 

insert into field_values(field_column_id, thing_id, content) values(1, 1, 'thing1 val1'); 
insert into field_values(field_column_id, thing_id, content) values(2, 1, 'thing1 val2'); 
insert into field_values(field_column_id, thing_id, content) values(1, 2, 'thing2 val1'); 
insert into field_values(field_column_id, thing_id, content) values(2, 2, 'thing2 val2'); 

請包括這些腳本未來,當你問時間尋求幫助,並確保你的腳本是正確的。這將減少回答你的問題所需的工作。

您可以通過聚集鍵值對與jsonb_object_agg

select 
    t.id, 
    jsonb_object_agg(fc.name, fv.content) 
from 
    things t inner join 
    field_values fv on fv.thing_id = t.id inner join 
    field_columns fc on fv.field_column_id = fc.id 
group by 1 

結果看起來像這樣讓你jsonb值:

thing_id;jsonb_value 
1;"{"col1": "thing1 val1", "col2": "thing1 val2"}" 
2;"{"col1": "thing2 val1", "col2": "thing2 val2"}"