将嵌套的 JSON 从 PostgreSQL 的多对多连接表返回到 node.js

Posted

技术标签:

【中文标题】将嵌套的 JSON 从 PostgreSQL 的多对多连接表返回到 node.js【英文标题】:Returning nested JSON from many to many joined table from PostgreSQL to node.js 【发布时间】:2015-01-05 19:31:50 【问题描述】:

谁能帮我在 postgres 中查询多对多关系表?

我有桌子:

> 1.exercise(id,name)
> 2.tag(id,label)
> 3.tag_in_exercise(id,exercise_id,tag_id)

假设我们通过 tag_in_exercise 将一个练习与两个标签绑定

使用查询时:

select e.id,t.label from exercise e 
left join tag_in_exercise te on e.id=te.exercise_id  
left join tag t on te.tag_id=t.id

我会收到 json

[  id: 1,
    label: 'basic1' ,
   id: 1,
    label: 'basic2' ]

但我想将其作为嵌套 json 接收

[  id: 1,
    tags:[ 'basic1','basic2' ]
]

是否可以通过使用标准的 postgresql 查询来获得它,或者我需要使用一些 ORM?

或者如果存在其他解决方案,请告诉我,

谢谢

【问题讨论】:

您的查询中没有任何内容告诉 PostgreSQL 返回 JSON。您的节点驱动程序必须将结果转换为 JSON。 【参考方案1】:

PostgreSQL 不返回您发布的 javascript 对象。您的节点驱动程序正在转换 PostgreSQL 返回的数组数组,驱动程序正在将其转换为 JavaScript 对象。

但是,您可以让 PostgreSQL 返回一个结构,我怀疑该结构将通过使用 array_agg 进行转换。

试试这个:

SELECT e.id,array_agg(t.label) AS label FROM exercise e LEFT JOIN tag_in_exercise te on e.id=te.exercise_id LEFT JOIN tag t on te.tag_id=t.id GROUP BY e.id;

您将获得所需结构的原始 PostgreSQL 结果,希望驱动程序能够按照您的意图进行翻译:

id | label ----+----------------- 1 | basic1,basic2 2 | NULL

【讨论】:

以上是关于将嵌套的 JSON 从 PostgreSQL 的多对多连接表返回到 node.js的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 嵌套 JSON 查询

Redshift Postgresql - 如何解析嵌套的 JSON

查询嵌套 JSON 数组 PostgreSQL 中的所有元素

在 PostgreSQL 9.3 中为 json 字段的嵌套属性创建索引的多种方法

将嵌套解码转换为等效的 CASE 语句(需要从 Oracle 转换为 PostgreSQL)

将新的键/值对添加到 PostgreSQL JSON 列内的嵌套数组中