在 prisma 的循环中替换查询
Replacing queries in a loop in prisma
我有一个 API 端点需要获取 30 个项目的数据,它需要检查两个不同字段中的值以 return 正确。我正在使用 Prisma ORM。
在一个请求中,我得到一个对象数组,如下所示:
{
'6151': 12
},
其中键是 part_num,值是 color_id。我将键和值分成数组,我正在循环中一个一个地寻找每个元素:
const elements = [];
for (let i = 0; i < partNums.length; i++) {
const element = await prisma.elements.findFirst({
where: { AND: { part_num: partNums[i], color_id: colors[i] } },
});
elements.push(element);
}
它似乎工作正常,但我读到对数据库进行多次查询是一种不好的做法,所以我的问题是:
有没有办法在一次查询中获得相同的结果?
我唯一的想法是仅通过其中一个字段获取所有元素,而不是过滤掉我不需要的元素。然而,这首先需要从数据库中获取更多元素,并且过滤也需要一些时间。
您可以使用单个 findMany
查询。您需要在循环中生成 where
条件。它将是一组 OR
条件,每个条件指定一个 Element
记录。
这是带有一些注释的代码,用于解释它的作用
let findManyOrCondition = []; // each entry will contain a single part_nums, color_id condition pair.
for (let i = 0; i < partNums.length; i++) {
// AND condition between part_num and color_id is implicit
findManyOrCondition.push({
part_num: partNums[i],
color_id: colors[i],
});
}
// fetch all of the elements with one query.
const elements = await prisma.elements.findMany({
where: {
OR: findManyOrCondition,
},
});
我有一个 API 端点需要获取 30 个项目的数据,它需要检查两个不同字段中的值以 return 正确。我正在使用 Prisma ORM。
在一个请求中,我得到一个对象数组,如下所示:
{
'6151': 12
},
其中键是 part_num,值是 color_id。我将键和值分成数组,我正在循环中一个一个地寻找每个元素:
const elements = [];
for (let i = 0; i < partNums.length; i++) {
const element = await prisma.elements.findFirst({
where: { AND: { part_num: partNums[i], color_id: colors[i] } },
});
elements.push(element);
}
它似乎工作正常,但我读到对数据库进行多次查询是一种不好的做法,所以我的问题是:
有没有办法在一次查询中获得相同的结果?
我唯一的想法是仅通过其中一个字段获取所有元素,而不是过滤掉我不需要的元素。然而,这首先需要从数据库中获取更多元素,并且过滤也需要一些时间。
您可以使用单个 findMany
查询。您需要在循环中生成 where
条件。它将是一组 OR
条件,每个条件指定一个 Element
记录。
这是带有一些注释的代码,用于解释它的作用
let findManyOrCondition = []; // each entry will contain a single part_nums, color_id condition pair.
for (let i = 0; i < partNums.length; i++) {
// AND condition between part_num and color_id is implicit
findManyOrCondition.push({
part_num: partNums[i],
color_id: colors[i],
});
}
// fetch all of the elements with one query.
const elements = await prisma.elements.findMany({
where: {
OR: findManyOrCondition,
},
});