node.js - 如何在 sequelize 中进行多个查询?

标签 node.js postgresql express sequelize.js

我正在尝试对过滤器端点进行多个查询。假设端点是 router.get('/filter', caseController.getCasesByFilteredRecord);
我希望用户能够在前端进行多个查询。基于 Sequelize 文档,我想出了下面的代码。但是当我测试它时,它使用 AND 来绑定(bind)所有查询,而不是显示所选查询的结果。请参阅下面我的代码:

根据@MOLDA 建议修改

exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        var where = [];
        // iterate over the params
        for (let q in req.query) {
            var obj = {};
            obj[q] = { [Op.eq]: req.query[q] };
            // if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
            where.push(obj);
        }
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: {
              [Op.or]: [
            {
             discoveryMethod: {
                [Op.eq]: req.query.discoveryMethod
                  }
            },
            {
            caseAge: {
                [Op.eq]: req.query.caseAge
                  }
            },
            {
            caseGender: {
                [Op.eq]: req.query.caseGender
                  }
            },
            {
            caseComorbidity: {
                [Op.eq]: req.query.caseComorbidity
                  }
            },
            {
            testResult: {
                [Op.eq]: req.query.testResult
                  }
            },
            {
            priority: {
                [Op.eq]: req.query.priority
                  }
                },
            {
            caseStatus: {
                [Op.eq]: req.query.caseStatus
                        }
            },
            {
            requireBedAdmission: {
                [Op.eq]: req.query.requireBedAdmidsion
                        }
            },
            {
            requireICUBed: {
                [Op.eq]: req.query.requireICUBed
                        }
            },
            {
            requireVentilator: {
              [Op.eq]: req.query.requireVentilator
                        }
            }  
                  ]
              },
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResult
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};

假设我的查询类似于 http://localhost:8004/api/v1/cases/filter?caseComorbidity=HBP&testResult=positive&caseGender=Male
Sequelise 将从案例中选择,其中这些查询是输入的值,并为其他人连接所有空值。但我只希望它选择我在查询中输入值的位置并省略空查询。

最佳答案

您应该构建 where根据您收到的查询参数。

exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        var where = [];
        // iterate over the params
        for (let q in req.query) {
            var obj = {};
            obj[q] = { [Op.eq]: req.query[q] };
            // if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
            where.push(obj);
        }
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: {
                [Op.or]: where // assign the "where" array here
            },
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResults
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};

我没有测试它,所以期待一些错误;)

编辑
exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: req.query, // <-- req.query -> { discoveryMethod: 'blabla' } -> some.url?discoveryMethod=blabla
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResults
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};

关于node.js - 如何在 sequelize 中进行多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62036643/

相关文章:

angularjs - ExpressJS 中间件的 "res.sendFile"和 Angular 客户端的 "ng-src"的组合不起作用

node.js - 在WebStorm中使用supertest产生 'Argument type is not assignable to parameter type'和 'Unresolved function or method'

javascript - 使用单个 frisby.js 测试文件创建多个 cookie

postgresql 数据库总大小与单个表大小的总和不匹配

postgresql - Postgres 在连接到服务器时是否使用本地资源?

python - SQLalchemy pickle 类型在数据库中存储超过需要

node.js - 结合express设置peerJS服务器

node.js - express.js + socket.io - 如何从客户端应用程序初始化服务器上​​的 session

javascript - 使用 forEach Firebase Cloud Functions 时出现未处理的错误 TypeError : snapshot. val 不是函数

node.js - Expo React Native : expected version range: ~6. 0.0 - 实际安装的版本 : ^5. 0.1