如何在Sequelize中按枚举数组类型过滤查询?
解决方案
当你的字段是PostgreSQL的**枚举数组(ARRAY(ENUM))**类型时,不能直接使用Op.in进行过滤——这会触发values.map is not a function错误,因为Sequelize会错误地将你传入的数组当作单个值处理,而非针对数组字段的匹配条件。
以下是几种正确的过滤方式:
方法1:使用Op.contains(匹配包含所有指定值的数组)
如果需要查询job_type数组同时包含Contract和Permanent的记录:
const profiles = await Profile.findAll({ where: { job_type: { [Op.contains]: ['Contract', 'Permanent'] }, }, });
方法2:使用Op.any(匹配包含至少一个指定值的数组)
如果需要查询job_type数组包含Contract或Permanent中任意一个的记录:
const profiles = await Profile.findAll({ where: { job_type: { [Op.any]: ['Contract', 'Permanent'] }, }, });
方法3:使用原始SQL(灵活的数组交集匹配)
利用PostgreSQL的数组交集操作符&&,检查字段数组与目标值数组是否有重叠元素:
const profiles = await Profile.findAll({ where: sequelize.literal(`job_type && ARRAY['Contract', 'Permanent']::"enum_profiles_job_type"[]`), });
注意:enum_profiles_job_type是数据库自动生成的枚举类型名称,格式通常为enum_<表名>_<字段名>,需根据你的实际表名调整。
错误原因说明
你原本的Op.in写法用于匹配单个值是否在指定集合中,但job_type本身是数组类型,Sequelize处理时会尝试将传入的数组当作单个值进行类型转换,导致内部调用values.map时因数据类型不匹配报错。
内容的提问来源于stack exchange,提问作者Kingsley Ijomah
相关产品推荐
相关产品推荐

