我在一个表中具有技能,在另一表中具有user_skills,并且在for循环中从技能表获取针对ID的技能。我已将查询结果存储在javascript数组中。我想要一个带有对象的数组。我在数组结构中得到数组。正如您在图像中看到的那样,我在数组中获得多个数组。它应该是单个数组中的对象。
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);
}
console.log('skillsArray', skillsArray);
ctx.body = {
status: 200,
error: false,
message: "Skills found",
data: skillsArray
};
我相信这就是您想要的
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
中,在这种情况下,您只需在单个查询中获得所需的数据,这被认为是不好的。练习像这样在for(...)
循环中执行查询。您应该使用Sequelize之类的ORM或您喜欢的任何其他ORM并与KOA配合良好,希望这一点对您有所帮助:
假设skill_array
实际上是postgres中的一个数组,您可以将这两个查询合并为一个:
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.push(findSkill.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"
,然后只需要用逗号分隔该字段即可获得所需的数组。