如何从javascript数组响应中获取行?
我在一个表中有技能,在另一个表中有用户_技能,并在for循环中根据技能表中的id获取技能。我将查询结果存储在javascript数组中。我想要一个包含对象的数组。我得到了数组结构中的数组。正如你们在图中看到的,我在数组中得到了多个数组。它应该是单个数组中的对象如何从javascript数组响应中获取行?,javascript,postgresql,Javascript,Postgresql,我在一个表中有技能,在另一个表中有用户_技能,并在for循环中根据技能表中的id获取技能。我将查询结果存储在javascript数组中。我想要一个包含对象的数组。我得到了数组结构中的数组。正如你们在图中看到的,我在数组中得到了多个数组。它应该是单个数组中的对象 我相信这就是你想要的 var userExist = await ctx.app.pool.query("SELECT * FROM USER_SKILLS WHERE user_id = $1", [`${user_id}`])
我相信这就是你想要的
var userExist = await ctx.app.pool.query("SELECT * FROM USER_SKILLS WHERE user_id = $1",
[`${user_id}`]);
var strArray = userExist.rows[0].skill_array.split(",");
var i;
var skillsArray = [];
for (i = 0; i < strArray.length; i++) {
var findSkill = await ctx.app.pool.query("SELECT skill_name FROM ALL_SKILLS WHERE id = $1",
[`${strArray[i]}`]);
skillsArray.push(findSkill.rows[0]);
}
console.log('skillsArray', skillsArray);
ctx.body = {
status: 200,
error: false,
message: "Skills found",
data: skillsArray
};
但正如我在评论中提到的,我建议您将数据库表/模式设置为关系M:M,在您的情况下,您只需在单个查询中获取所需的数据,而在中进行查询被认为是不好的做法。。。像这样循环。你应该使用ORM或任何其他ORM,你喜欢的和膝关节炎很好,我希望这有助于你实现这一点:假设SkyLyLab阵实际上是PASGRESs中的一个数组,你可以将这两个查询组合为:
const query = "SELECT skill_name
FROM ALL_SKILLS
WHERE id = ANY((
SELECT skill_array
FROM USER_SKILLS
WHERE user_id = $1
))";
const res = await ctx.app.pool.query(query, [`${user_id}`]);
这将比执行多个查询更有效
那么,之所以使用数组获取数组,是因为skillsArray.pushfindSkill.rows将整个rows属性(即数组)放入skillsArray数组中
我并不完全清楚您想要的结果的格式,但我假设它是数组中的实际技能名称,类似于:
{
message: "Skills found",
data: [
"PHP",
"Node js"
]
}
在这种情况下,您可以将代码重组为如下内容:
const query = "SELECT STRING_AGG(skill_name, ',') AS skill_names
FROM ALL_SKILLS
WHERE id = ANY((
SELECT skill_array
FROM USER_SKILLS
WHERE user_id = $1
))";
const res = await ctx.app.pool.query(query, [`${user_id}`]);
const skillNames = res.rows[0].skill_names.split(',');
ctx.body = {
status: 200,
error: false,
message: "Skills found",
data: skillNames
};
我添加了一个STRING_AGG,因为如果可能的话,我喜欢在一行中获取postgres结果,而不是让pg按顺序读取多行,我相信这样会更快。我没有使用ARRAY_AGG,因为我不知道pg模块如何处理数组,不管它是将数组转换为字符串还是js数组。因此,我返回一个字段,其中的技能用逗号连接,例如PHP、Node js,然后只需将该字段用逗号拆分即可得到所需的数组。共享您得到的异常。这可以在一个查询中轻松执行,但您需要提供有关结构的更多信息:skill\u array是什么数据类型?如果它是一个实际的postgres数组,它是否会在开头/结尾包含{}字符?假设它以字符串的形式进入pg,否则为什么要拆分它?更一般地说,你必须告诉我们你不工作的确切含义。错误未返回预期结果?是否可以在此处添加表架构?这将有助于修复您的错误,正如@404所提到的,这应该是在使用join的单个数据库查询中。
const query = "SELECT STRING_AGG(skill_name, ',') AS skill_names
FROM ALL_SKILLS
WHERE id = ANY((
SELECT skill_array
FROM USER_SKILLS
WHERE user_id = $1
))";
const res = await ctx.app.pool.query(query, [`${user_id}`]);
const skillNames = res.rows[0].skill_names.split(',');
ctx.body = {
status: 200,
error: false,
message: "Skills found",
data: skillNames
};