我正在编写一个使用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'
}
}
但是,除了手动为每个列添加别名外,我还可以使用任何方便的解决方案。
答案 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
}
};
});