节点postgres和重复名称的连接字段

时间:2015-10-08 18:35:48

标签: javascript json node.js postgresql

我正在编写一个使用pg包访问PostgreSQL数据库的node.js应用程序。我遇到的问题是如果我这样做一个查询:

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

当我得到结果时,它们都在同一个命名空间中,因此在blogs表中重复的任何字段都将覆盖posts表中的字段。

我的问题是,将这些结果绑定到对象的最佳方法是什么?

理想情况下,我喜欢这样的结果:

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

但是,除了手动为每个列添加别名外,我还可以使用任何方便的解决方案。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:-1)

如果您将查询更改为

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

您的列名应以“帖子”或“博客”为前缀

如果你想要一个像上面那样的嵌套结果,你必须运行一些手动处理。

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