Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 347
BML91 Avatar asked Oct 23 '18 17:10

BML91


2 Answers

Try this:

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

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

like image 118
Baloran Avatar answered Oct 05 '22 13:10

Baloran


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.

like image 23
McWally Avatar answered Oct 05 '22 14:10

McWally