[英]Returning Postgres Nested JSON Array
I have been searching around for an answer for this but haven't found anything close enough to what I was looking for.我一直在寻找答案,但没有找到与我所寻找的足够接近的东西。
I have two tables:我有两张桌子:
CREATE TABLE skill_tree (
ID SERIAL PRIMARY KEY,
NAME TEXT NOT NULL,
DESCRIPTION TEXT NOT NULL
);
and和
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)
);
I am trying to return JSON from my Postgres DB in such a way that it is structured like so:我试图从我的 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
}]
}]
I was able to get something similar from here PostgreSQL and nodejs/pg, return nested JSON but wasn't able to retrieve anything more than the skill's name.我能够从这里PostgreSQL 和 nodejs/pg 获得类似的东西,返回嵌套的 JSON ,但除了技能名称之外无法检索任何内容。
The table skill
should look like this:餐桌
skill
应该是这样的:
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!
);
Use jsonb_build_object()
and jsonb_agg()
.使用
jsonb_build_object()
和jsonb_agg()
。 Note, the query is somehow similar to the expected object.请注意,查询在某种程度上类似于预期的对象。
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;
I've wrapped the result with jsonb_pretty() to get a nice output:我用 jsonb_pretty() 包装了结果以获得一个不错的输出:
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"+
} +
]
Note that the order of elements of a json object is undefined.请注意,json 对象的元素顺序是未定义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.