使用pg-promise很容易做到:
function buildTree(t) { const v = q => t.any('SELECt id, value FROM votes WHERe question_id = $1', q.id) .then(votes => { q.votes = votes; return q; }); return t.map('SELECt * FROM questions', [], v).then(t.batch);}db.task(buildTree) .then(data => { console.log(data); // your data tree }) .catch(error => { console.log(error); });API:map,any,task,batch
相关问题:
- 用pg-promise获得父母和孩子的树
- pg-promise的条件任务
而且,如果您只想使用一个查询,那么使用PostgreSQL 9.4和更高版本的语法,您可以执行以下操作:
SELECt json_build_object('id', q.id, 'content', q.content, 'votes', (SELECT json_agg(json_build_object('id', v.id, 'value', v.value)) FROM votes v WHERe q.id = v.question_id))FROM questions q然后,您的pg-promise示例将是:
const query = `SELECt json_build_object('id', q.id, 'content', q.content, 'votes', (SELECT json_agg(json_build_object('id', v.id, 'value', v.value)) FROM votes v WHERe q.id = v.question_id)) json FROM questions q`;db.map(query, [], a => a.json) .then(data => { console.log(data); // your data tree }) .catch(error => { console.log(error); });而且,您肯定希望将这样复杂的查询保留在外部SQL文件中。请参阅查询文件。
结论
上面介绍的两种方法之间的选择应基于您的应用程序的性能要求:
- 单查询方法速度更快,但是有点冗长,但难以读取或扩展
- 多查询方法更易于理解和扩展,但由于执行的查询数量动态,因此性能不佳。



