Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 用PostgreSQL构造查询响应_Node.js_Postgresql_Express - Fatal编程技术网

Node.js 用PostgreSQL构造查询响应

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

由于可能有多个源需要查询事件,因此在每个事件上添加一个具有关联源数组值的source键。所需的最终结构如下:

{
“事件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连接算法以查看示例和优缺点。
如果表位于不同的数据库中,那么实际上客户端连接可能是您唯一的选择。不过,如果您对底层分布有所了解,那么最好进行哈希连接,因为它们位于同一数据库中。谢谢,我将研究如何重新构造基础查询。