[英]How to “zip” multiple nested JSON arrays without using id key?
我试图不看id
合并一些嵌套的JSON数组。 目前,当我向/surveyresponses
发出GET
请求时,我得到了这个:
{
"surveys": [
{
"id": 1,
"name": "survey 1",
"isGuest": true,
"house_id": 1
},
{
"id": 2,
"name": "survey 2",
"isGuest": false,
"house_id": 1
},
{
"id": 3,
"name": "survey 3",
"isGuest": true,
"house_id": 2
}
],
"responses": [
{
"question": "what is this anyways?",
"answer": "test 1"
},
{
"question": "why?",
"answer": "test 2"
},
{
"question": "testy?",
"answer": "test 3"
}
]
}
但是我想在每个调查都有自己的问题和答案的地方得到它,如下所示:
{
"surveys": [
{
"id": 1,
"name": "survey 1",
"isGuest": true,
"house_id": 1
"question": "what is this anyways?",
"answer": "test 1"
}
]
}
因为我不会使用特定的id
所以我不确定如何使这种关系正常工作。 这是我正在产生这些结果的当前查询。
export function getSurveyResponse(id: number): QueryBuilder {
return db('surveys')
.join('questions', 'questions.survey_id', '=', 'surveys.id')
.join('questionAnswers', 'questionAnswers.question_id', '=', 'questions.id')
.select('surveys.name', 'questions.question', 'questions.question', 'questionAnswers.answer')
.where({ survey_id: id, question_id: id })
}
假设当前Postgres 10或11中为 jsonb
,则此查询可以完成此工作:
SELECT t.data, to_jsonb(s) AS new_data
FROM t
LEFT JOIN LATERAL (
SELECT jsonb_agg(s || r) AS surveys
FROM (
SELECT jsonb_array_elements(t.data->'surveys') s
, jsonb_array_elements(t.data->'responses') r
) sub
) s ON true;
db <> 在这里拨弄
我同时嵌套两个嵌套的JSON数组,以直接获得所需的“压缩”两个行为。 两个嵌套JSON数组中的元素数量必须匹配,否则您需要做更多(否则会丢失数据)。
这建立在Postgres如何处理SELECT
列表中的多个返回集合函数以使其简短而快速的实现细节上。 看到:
使用ROWS FROM
表达式可以更明确,自Postgres 9.4起可以正常使用:
SELECT t.data
, to_jsonb(s) AS new_data
FROM tbl t
LEFT JOIN LATERAL (
SELECT jsonb_agg(s || r) AS surveys
FROM ROWS FROM (jsonb_array_elements(t.data->'surveys')
, jsonb_array_elements(t.data->'responses')) sub(s,r)
) s ON true;
或者,您可以使用WITH ORDINALITY
获取元素的原始顺序并根据需要进行组合:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.