如何从javascript数组响应中获取行?

问题描述 投票:0回答:2

我在一个表中具有技能,在另一表中具有user_skills,并且在for循环中从技能表获取针对ID的技能。我已将查询结果存储在javascript数组中。我想要一个带有对象的数组。我在数组结构中得到数组。正如您在图像中看到的那样,我在数组中获得多个数组。它应该是单个数组中的对象。

response

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
        };
javascript postgresql
2个回答
0
投票

我相信这就是您想要的

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配合良好,希望这一点对您有所帮助:


0
投票

假设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",然后只需要用逗号分隔该字段即可获得所需的数组。

© www.soinside.com 2019 - 2024. All rights reserved.