2016-05-04 3 views
1

Я использую PostgreSQL с nodejs и pg. Все работает нормально, но я хочу вывести результат PostgreSQL как вложенный json - как если бы я работал с MongoDB или аналогичным.PostgreSQL и nodejs/pg, return inested JSON

Мои 2 таблиц из PostgreSQL являются:

portfolio (id int, name text) 

cars (portfolio_id int, name text); 

Есть ли «правильный» способ возвращения объекта JSON со следующей структурой:

{ 
    { name: 'Portfolio #1', cars: { name: 'Car #1', name: 'Car #2' }, 
    { name: 'Portfolio #2', cars: { name: 'Car #3' } 
} 

Моего общим способом запросов к базе данных в nodejs/pg is:

client.query('SELECT ...', [params], function(err, result) { 
    done(); 
    if (err) { 
     res.status(500).json({ error: err }); 
    } else { 
     res.json({ portfolios: result.rows }); 
    } 
}); 

ответ

1

В PostgreSQL вы можете построить следующий объект JSON:

[ 
    { "name": "Portfolio #1", "cars": [ "Car #1", "Car #2" ] }, 
    { "name": "Portfolio #2", "cars": [ "Car #3" ] } 
] 

Вы можете построить объект из таблиц с помощью следующего запроса:

select array_to_json(array(
    select row_to_json(n) 
    from portfolio p 
    left join lateral (select p.name, array(select name from cars where portfolio_id = p.id) as cars) n on true 
)) 

И с cars.votes полей включены:

select array_to_json(array(
    select row_to_json(n) 
    from portfolio p 
    left join lateral (select p.id, p.name, array_to_json(array(
    select row_to_json((select a from (select c.name, c.votes) a)) 
    from cars c 
    where portfolio_id = p.id)) as cars) n on true 
)) 
+0

я пропускаю "имя:" в автомобили, и пытаются получить 2 параметра для моих автомобилей: http://pastebin.com/GR0jb6VK. Однако он не работает с «... subquery должен возвращать только один столбец». Вы можете помочь? –

+0

Я думаю, что это с «... SELECT car_name, votes FROM ...» –

+0

@MichaelNielsen Я обновил ответ на 'cars.votes' в нем. Запрос значительно сложнее и будет увеличиваться по сложности, тем больше материала вы хотите добавить в него. –