Node.js 用PostgreSQL构造查询响应
我试图构造一个查询,从多个表返回数据,并将它们构建到一个对象数组中,以返回到客户机。我有两个表格,事件和来源。每个源都有一个与第一个表中的事件对应的事件id 由于可能有多个源需要查询事件,因此在每个事件上添加一个具有关联源数组值的source键。所需的最终结构如下:Node.js 用PostgreSQL构造查询响应,node.js,postgresql,express,Node.js,Postgresql,Express,我试图构造一个查询,从多个表返回数据,并将它们构建到一个对象数组中,以返回到客户机。我有两个表格,事件和来源。每个源都有一个与第一个表中的事件对应的事件id 由于可能有多个源需要查询事件,因此在每个事件上添加一个具有关联源数组值的source键。所需的最终结构如下: { “事件id”:1, “id”:“wa-olympia-1”, “城市”:“奥林匹亚”, “州”:“华盛顿”, “lat”:47.0417, “长”:-122.896, “标题”:“警方以过度武力应对破窗事件”, “描述”:"录像
{
“事件id”:1,
“id”:“wa-olympia-1”,
“城市”:“奥林匹亚”,
“州”:“华盛顿”,
“lat”:47.0417,
“长”:-122.896,
“标题”:“警方以过度武力应对破窗事件”,
“描述”:"录像显示,有几个人从抗议活动中挣脱出来,砸碎市政厅的窗户。抗议者向破坏者大声喊叫,要求他们停下。\n\n许可证随后到达。他们在市政厅窗户附近逮捕了多人,其中一人似乎接近破坏者,试图平息局势。\n\n许可证在附近发射催泪瓦斯和防暴弹逮捕过程中的抗议者。抗议者变得激动起来。\n\n在警察将被逮捕者带走后,抗议者继续对警察大喊大叫。警察用第二轮催泪瓦斯和防暴弹进行回应。\n\n可以听到一声种族诽谤声,尽管不确定是谁在大喊大叫。”,
“日期”:“2020-05-31T05:00:00.000Z”,
“src”:['http://google.com']
}
以下是目前的路线:
router.get('/showalincidents',(req,res)=>{
事件。getAllIncidents()
。然后((响应)=>{
常量事件=响应.map((事件)=>{
const sources=events.createSourcesArray(event.event\u id);
返回{
发生的事情
src:来源,
};
});
res.json(事件);
})
.catch((错误)=>{
json({message:'Request Error'});
});
});
以下是我目前拥有的模型:
异步函数getAllIncidents(){
返回等待db(“事件”);
}
异步函数createSourcesArray(事件id){
const sources=await db(‘sources’)
。选择(“*”)
.where(‘来源、事件编号’、事件编号);
返回源;
}
当这个端点被击中时,我得到一个“太多的连接”“错误。请告知。我找到了解决办法。我决定独立地查询这两个表。然后我循环第一个结果数组,在该循环中循环第二个数组,检查它们共享的外键,然后当我找到匹配项时,将这些结果添加到原始对象的数组中,然后返回一个新数组,其中包含第一个对象的对象以及第二个对象的关联数据。型号不变,这是更新后的路线
router.get('/showalincidents',异步(req,res)=>{
试一试{
常量事件=等待事件。getAllIncidents();
const sources=等待事件。getAllSources();
const responseArray=[]
//使用要发送到前端的源重建事件对象
事件。forEach((事件)=>{
事件['src']=[]
sources.forEach(source=>{
if(source.incident\u id==incident.incident\u id){
incident.src.push(源)
}
})
响应推送(事件)
})
res.json(responseArray)
}捕获(e){
res.status(500).json({
消息:“请求错误”
});
}
});代码>这两个表在同一个数据库中吗?如果是这样的话,那么通过SQL连接进行主键/外键匹配要有效得多。您实现的是“嵌套循环联接”,根据主键的值分布,它可能不是匹配的最佳方式。您可以搜索SQL连接算法以查看示例和优缺点。
如果表位于不同的数据库中,那么实际上客户端连接可能是您唯一的选择。不过,如果您对底层分布有所了解,那么最好进行哈希连接,因为它们位于同一数据库中。谢谢,我将研究如何重新构造基础查询。