代码中的大型SQL OR语句或过滤器?

时间:2018-04-27 14:42:04

标签: javascript mysql sql node.js sequelize.js

假设我有大量的ID,大约10,000个项目。每个ID都是由数字组成的唯一字符串,大约20个字符。

['438122955667406858', '427968416155041792', '427968416155041792', '387734570570743849'...]

我还有一个数据库表,其中ID对应于数组中的ID。表中的ID是唯一,表可以有多个ID匹配的行,如下所示:

所以问题出现在这里:10,000个ID的数组分为10个左右的进程,因此每个进程的共享大约为1000个唯一ID。每个进程必须从数据库中请求20 + k个条目,其ID在进程中的任何行。分享ID。

最后一个问题是,构建一个大的[Op.or]语句,让SQL服务器完成工作会更好吗:

table.findAll({
    where: {
        guild: {
            [Op.or]: ThousandIDArray,
        }
    }
}).then(rows => rows.forEach(r => doSomething()))

或请求所有行,并按进程手动过滤?

table.findAll().then(rows => {
    rows.forEach(r => {
        if (ThousandIDArray.includes(r.guild)) doSomething();
    })
})

1 个答案:

答案 0 :(得分:0)

如果我正确地理解了你的问题,你就不会通过将工作分成1000组来保存任何东西。将所有感兴趣的ID放在一个数组中会更简单,并执行以下操作:

let result = await [model].findAll({
    where: {
        [Op.in]: [uuid, uuid, uuid, uuid, ...]
    }
});

Sequelize Operators