繁体   English   中英

如何在不使用id键的情况下“压缩”多个嵌套的JSON数组?

[英]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 1011中为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM