简体   繁体   中英

Sequelize - does not contain a string within a PostgreSQL array query

I have a Sequelize model called Staff . On it there's an array field described as follows:

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)
    },
});

I'm trying to create a GraphQL end point which serves up all staff which don't have 'instructor' in their roles field.

I've read this page of the docs , suggesting that I use a combination of Sequelize.Op . So I created this:

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

The above throws the error:

"message": "values.map is not a function"

However, if I am to try a query which isn't a combo such as:

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

The query runs properly, this leads me to believe I perhaps have a syntax error or misunderstanding of how Op logic is combined.

Try this:

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

The clause $not need to be prior than the column you target.

This worked just fine for me:

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

Sequelize.Op.not have to come before the column that's being reffered to.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM