如何从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}`])

我在一个表中有技能,在另一个表中有用户_技能,并在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[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
};