2015-10-08 52 views
2

我正在寫一個使用PG包用於訪問PostgreSQL數據庫的應用程序的Node.js。我遇到的問題是,如果我不喜歡這樣的查詢:節點的Postgres和獲得加盟領域反覆名

select * from posts p inner join blogs b on b.id = p.blog_id 

當我得到的結果,他們都在同一個命名空間,所以在博客表重複任意字段將會覆蓋在帖子表中。

我的問題是,什麼是結合這些結果對象的最佳方式?

理想情況下,我想類似的結果:

{ 
    id: 1, 
    name: 'A post name', 
    published_at: (some date object), 
    blog_id: 1, 
    b: { 
     id: 1, 
     name: 'A blog name' 
    } 
} 

但我願意手動添加一個別名,每列的任何方便的解決方案短。

+0

數據到對象的映射由ORM-s,這節點postgres的是沒有這樣做。你必須手動完成。 –

+2

@ vitaly-t:我不一定需要它成爲一個對象。基本上我只是希望返回的所有表都是命名空間,這樣我就可以訪問所有字段而不必使用別名。 – cdmckay

+0

您是否找到解決方法?我遇到了同樣的問題,但似乎沒有任何迴應解決這個問題。 'pg'結果包含一個屬性'rows',其中結果是合併的,'fields'是不同的(但它只是列的名稱,沒有值)。 – Demurgos

回答

-1

如果你改變你的查詢

'SELECT * FROM posts, blogs WHERE posts.id = blogs.id;' 

你應該以「帖子」或前綴列名「博客」

如果你想有一個嵌套的結果像上面,你將有運行一些手動處理。

res.map(d => { 
    return { 
    id: d.posts_id 
    b : { 
     id: d.blogs_id 
    } 
    }; 
}); 
+0

爲什麼它在這種情況下加上前綴?這是'pg'的一個特性嗎? – cdmckay

+0

另外,你的意思是'posts.blog_id = blogs.id'? – cdmckay

+0

抱歉 - 我不確定你的桌子是什麼樣的。但是如果你從(table1,table2)中選擇*,table1中的字段將以table1_ –

3

http://www.postgresql.org/docs/9.3/static/functions-json.html http://www.postgresql.org/docs/9.4/static/functions-aggregate.html

你可能想看看的Postgres的JSON功能。

SELECT 
    p.*, /* Select all the post fields */ 
    row_to_json(blogs.*) as b /* Use the row_to_json function on the blogs results */ 
FROM 
    posts p 
INNER JOIN 
    blogs ON (blogs.id=p.blog_id); /* Join blogs on the proper fields */ 

返回:

{ 
    id: 3, 
    name: 'test', 
    published_at: 2015-10-08, 
    blog_id: 2, 
    b: { 
     id:2, 
     name:"test 2" 
    } 
} 

這裏有他們一個偉大的教程如果我理解你的權利,並沒有什麼,你正在尋找一個測試數據庫這樣的事情可能會接近: http://bender.io/2013/09/22/returning-hierarchical-data-in-a-single-sql-query/