Sequelize+TypeScript实现数组字段不含指定值查询的方案
错误原因说明
写法1报错原因
你在字段层级下嵌套Op.not + Op.contains的写法不符合Sequelize的运算符解析规则,Sequelize会错误将{[Op.contains]: [someValue]}识别为要匹配给arr1字段的字面量值,而不是继续解析为运算符逻辑,因此抛出数组类型验证错误。
写法2报错原因
你当前使用的Sequelize版本的TypeScript类型定义不支持Op.not后直接传入条件数组的写法,因此触发类型校验错误。即使强制忽略类型错误,这种写法的语义是NOT (条件1 OR 条件2),虽然逻辑上和你要的两个数组都不包含指定值等价,但类型适配性差。
正确实现方案
推荐直接使用Sequelize专为数组类型提供的Op.notContains运算符,原生适配PostgreSQL数组查询逻辑,同时兼容TypeScript类型校验,运行也不会报错:
import { Op } from 'sequelize'; // 你的查询逻辑 const result = await YourModel.findAll({ where: { arr1: { [Op.notContains]: [someValue] }, arr2: { [Op.notContains]: [someValue] } } });
如果需要用Op.not的写法实现,也可以调整运算符嵌套层级,把Op.not提到字段外层,配合Op.and使用:
import { Op } from 'sequelize'; const result = await YourModel.findAll({ where: { [Op.and]: [ { [Op.not]: { arr1: { [Op.contains]: [someValue] } } }, { [Op.not]: { arr2: { [Op.contains]: [someValue] } } } ] } });
两种写法生成的SQL都会直接在数据库层完成过滤,不需要全量拉取数据后在业务代码中过滤。
内容的提问来源于stack exchange,提问作者Shoham Ben Shitrit
相关产品推荐
相关产品推荐

