2016-05-04 25 views
1

Ich benutze PostgreSQL mit nodejs und pg. Alles funktioniert gut, aber ich möchte ein Ergebnis von PostgreSQL als verschachtelten JSON ausgeben - als ob ich mit MongoDB oder ähnlichem arbeiten würde.PostgreSQL und nodejs/pg, verschachtelte JSON zurück

Mys 2 Tabellen von PostgreSQL sind:

portfolio (id int, name text) 

cars (portfolio_id int, name text); 

Gibt es einen "richtigen" Weg, um ein JSON-Objekts mit der folgenden Struktur der Rückkehr:

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

Meine allgemeinen Möglichkeit, die Datenbank abzufragen in nodejs/pg ist:

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

Antwort

1

In PostgreSQL können Sie das folgende JSON-Objekt erstellen:

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

Sie könnten das Objekt von Tabellen mit der folgenden Abfrage konstruieren:

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 
)) 

Und mit cars.votes Felder enthalten:

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

Ich vermisse den "Namen" in der Autos, und versuchen, 2 Parameter für meine Autos zu bekommen: http://pastebin.com/GR0jb6VK. Es schlägt jedoch fehl mit "... Unterabfrage muss nur eine Spalte zurückgeben". Kannst du helfen? –

+0

Ich denke es ist mit dem "... SELECT car_name, votes FROM ..." –

+0

@MichaelNielsen Ich habe die Antwort mit 'cars.votes' darin aktualisiert. Die Abfrage ist wesentlich komplexer und würde in der Komplexität zunehmen, je mehr Dinge Sie hinzufügen möchten. –