如何实现Sequelize前缀匹配查询大小写不敏感?
Sequelize 实现大小写不敏感前缀搜索的配置方法
你当前代码中使用的Op.startsWith默认调用数据库原生前缀匹配逻辑,在字段排序规则为大小写敏感的场景下,会出现传入不同大小写关键词返回结果不一致的问题,按以下方案调整即可:
推荐方案(Sequelize v5及以上版本,全数据库兼容)
直接将所有匹配逻辑中的Op.startsWith替换为Sequelize内置的大小写不敏感前缀操作符Op.iStartsWith。该操作符会根据当前连接的数据库类型自动生成适配的不敏感查询语法(比如PostgreSQL环境下自动转ILIKE语法、MySQL环境下自动适配大小写忽略规则),不需要额外修改数据库或表配置。
另外你当前代码中await调用后额外叠加.then()属于冗余写法,可以直接删除简化逻辑。
修改后的完整查询代码如下:
// 确保文件头部正确引入需要的Sequelize方法 const { Op } = require("sequelize"); module.exports.MyFunction= async (req, res) => { let token = req.body.token; let decoded = jwt_decode(token); let loggedUserEmail = decoded.email; let data = req.body; let searchUser = data.user; console.log(searchUser); try { let user = await User.findAll({ where: { [Op.or]: [ { firstName: { [Op.iStartsWith]: searchUser } }, { lastName: { [Op.iStartsWith]: searchUser } }, { email: { [Op.iStartsWith]: searchUser } }, { publicKey: { [Op.iStartsWith]: searchUser } }, ], email: { [Op.ne]: loggedUserEmail, }, }, attributes: ["firstName", "lastName", "email", "publicKey", "avatar"], }); res.json({ user }); } catch (err) { res.json({ err }); } };
低版本Sequelize兼容方案
如果你使用的Sequelize版本低于v5,没有内置Op.iStartsWith操作符,可以选择以下任意一种方式实现:
- 针对PostgreSQL数据库:直接替换
Op.startsWith为Op.iLike,搜索值末尾拼接通配符%,写法为{ [Op.iLike]:${searchUser}%} - 全数据库通用写法:引入Sequelize的
fn、col、where方法,将字段存储值和传入的搜索值统一转为小写后做前缀匹配,不需要修改数据库排序规则,示例核心查询逻辑:
const { Op, fn, col, where } = require("sequelize"); // 省略参数解析逻辑 let user = await User.findAll({ where: { [Op.or]: [ where(fn('lower', col('firstName')), Op.startsWith, searchUser.toLowerCase()), where(fn('lower', col('lastName')), Op.startsWith, searchUser.toLowerCase()), where(fn('lower', col('email')), Op.startsWith, searchUser.toLowerCase()), where(fn('lower', col('publicKey')), Op.startsWith, searchUser.toLowerCase()), ], email: { [Op.ne]: loggedUserEmail }, }, attributes: ["firstName", "lastName", "email", "publicKey", "avatar"], });
注意:如果按上述方式调整后依然存在大小写敏感问题,检查对应数据库表字段的排序规则(collation),如果是
*_bin结尾的二进制排序规则,需要修改为*_ci(case insensitive)结尾的大小写不敏感排序规则,才能从数据库层面支持不敏感匹配。
内容的提问来源于stack exchange,提问作者Myrmelo
相关产品推荐
相关产品推荐

