2016-07-19 10 views
2

私はこれに対する答えを探していますが、私が探していたものに近いものは見つけられませんでした。PostgresネストされたJSON配列を返す

CREATE TABLE skill_tree (
    ID SERIAL PRIMARY KEY, 
    NAME TEXT NOT NULL, 
    DESCRIPTION TEXT NOT NULL 
); 

CREATE TABLE skill (
    ID SERIAL PRIMARY KEY, 
    NAME TEXT NOT NULL, 
    DESCRIPTION TEXT NOT NULL, 
    DURATION INTEGER NOT NULL, 
    COOLDOWN INTEGER NOT NULL, 
    SKILL_TREE_ID SERIAL REFERENCES skill_tree(id) 
); 

私はそれがそうのように構成されているように私のPostgresのDBからJSONを返すようにしようとしています:

[{ 
    "id": 1, 
    "name": "skill tree 1", 
    "description": "skill tree description", 
    "skills": [{ 
     "id": 1, 
     "name": "skill 1", 
     "description": "skill 1 desc", 
     "duration": 10, 
     "cooldown": 20 
    }, { 
     "id": 2, 
     "name": "skill 2", 
     "description": "skill 2 desc", 
     "duration": 20, 
     "cooldown": 30 
    }] 
}] 

は、私は2つのテーブルを持っています

私はここから似たようなものを得ることができました[PostgreSQL and nodejs/pg, return nested JSONしかしそれ以上何も検索できませんでしたスキルの名前。

CREATE TABLE skill (
    ID SERIAL PRIMARY KEY, 
    NAME TEXT NOT NULL, 
    DESCRIPTION TEXT NOT NULL, 
    DURATION INTEGER NOT NULL, 
    COOLDOWN INTEGER NOT NULL, 
    SKILL_TREE_ID INTEGER REFERENCES skill_tree(id) -- cannot be serial! 
); 

使用jsonb_build_object()jsonb_agg()を:

+1

今私は何が間違っているかを見ます。 'SKILL_TREE_ID'列はシリアルにすることはできません。 –

答えて

5

テーブルskillは、次のようになります。クエリは予期されるオブジェクトと何らかの形で似ていることに注意してください。 JSONオブジェクトの要素の順序は未定義であること

     result      
------------------------------------------------- 
[            + 
    {           + 
     "id": 1,        + 
     "name": "skill tree 1",    + 
     "skills": [       + 
      {         + 
       "id": 1,      + 
       "name": "skill 1",    + 
       "cooldown": 20,    + 
       "duration": 10,    + 
       "description": "skill 1 desc" + 
      },         + 
      {         + 
       "id": 2,      + 
       "name": "skill 2",    + 
       "cooldown": 30,    + 
       "duration": 30,    + 
       "description": "skill 2 desc" + 
      }         + 
     ],          + 
     "description": "skill tree description"+ 
    }           + 
] 

注:

select jsonb_pretty(jsonb_agg(js_object)) result 
from (
    select 
     jsonb_build_object(
      'id', id, 
      'name', name, 
      'description', description, 
      'skills', jsonb_agg(skill) 
     ) js_object 
    from (
     select 
      t.*, 
      jsonb_build_object(
       'id', s.id, 
       'name', s.name, 
       'description', s.description, 
       'duration', duration, 
       'cooldown', cooldown 
      ) skill 
     from skill_tree t 
     join skill s on s.skill_tree_id = t.id 
     ) s 
    group by id, name, description 
    ) s; 

私は素敵な出力を得るためにjsonb_pretty()で結果を包みました。

+0

これは修正のようです!今夜これを試してみる – invictvs1

関連する問題