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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:36:05