Sequelize - 在 PostgreSQL 数组查询中不包含字符串

6

我有一个名为Staff的Sequelize模型。它有一个数组字段,描述如下:

const Staff = sequelize.define("staff", {
    name: {
        type: DataTypes.STRING,
    },
    email: {
        type: DataTypes.STRING,
        unique: true
    },
    password: {
        type: DataTypes.STRING,
    },
    roles: {
        type: DataTypes.ARRAY(DataTypes.STRING)
    },
});

我正在尝试创建一个GraphQL端点,该端点提供所有在其roles字段中没有“instructor”的员工。

我已经阅读了文档中的此页面,建议我使用Sequelize.Op的组合。所以我创建了这个:

return Staff.findAll({
        where: {
            roles: {
                [Sequelize.Op.not]: {[Sequelize.Op.contains]: ['instructor']},
            }
        }
    }
)

上述代码会抛出错误:
"message": "values.map is not a function"

然而,如果我尝试一个不是组合框的查询,例如:
return models.Staff.findAll({
        where: {
            roles: {
                [Sequelize.Op.contains]: ['instructor']
            }
        }
    }
)

查询正常运行,这让我相信我可能存在语法错误或对Op逻辑的组合存在误解。


这个问题在GitHub上被报告了:https://github.com/sequelize/sequelize/issues/9338 - 因为过期而被关闭,如果能得到修复就太好了。 - BML91
2个回答

6

试试这个:

return models.Staff.findAll({
  where: {
    $not: {
      roles: {
        $contains: ['instructor'],
      },
    },
  },
})

$not子句需要放在目标列之前。


2

这对我来说完全有效:

return models.Staff.findAll({
   where: {
    [Sequelize.Op.not]: {
      roles: {
       [Sequelize.Op.contains]: ['instructor'],
      },
    },
  },
})

Sequelize.Op.not 不必出现在所引用的列之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接