You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:45:38