6

在弄清楚如何使用 Sequelize 使用嵌套值过滤 MySQL 表的 JSON 列中的行时需要帮助。文档没有(仅针对 PostgreSQL 和 MSSQL - ref提供)

表定义 -

module.exports = (sequelize, DataTypes) => {
  const Comment = sequelize.define('Comment', {
    action: DataTypes.STRING,
    type: DataTypes.STRING,
    reason: DataTypes.STRING,
    reference: DataTypes.JSON,
    active: {
      type: DataTypes.INTEGER,
      defaultValue: 1,
    },
  }, {
    classMethods: {
      associate(models) {
        Comment.belongsTo(models.User, {
          foreignKey: 'userId',
        });
      },
    },
  });
  return Comment;
};

表中参考列的值Comments-

{
  "orderItemId": 2,
  "xkey": 3,
  "ykey": 4
}
{
  "orderItemId": 4,
  "xkey": 1,
  "ykey": 1
}
{
  "orderItemId": 3,
  "xkey": 1,
  "ykey": 6
}
{
  "orderItemId": 2,
  "xkey": 1,
  "ykey": 0
}

如何过滤“orderItemId”为2的所有行。

预期的 SQL 查询

select * from Comments where reference->"$.orderItemId" = 2

想出了一个使用的方法sequelize.literal,但是有没有不使用这个功能的方法。

models.Comment.findAll({
  where: sequelize.literal(`reference->"$.orderItemId"=2`),
})

如何在上述情况下添加多个条件,例如 -

reference->"$.orderItemId" = 2 and action = 'xyz'

4

3 回答 3

14

需要使用Sequelize.Op

例子:

models.Comment.findAll({
    where: {
        action: 'xyz',
        [Op.and]: sequelize.literal(`reference->"$.orderItemId"=2`),
    },
});

续集(运营商)

于 2018-09-12T08:18:55.297 回答
3

您可以在下面使用。

Comment.findAll({
  action:'xys',
  'reference.orderItemid':2
})

// oR

Comment.findAll({
  action:'xys',
  reference:{
  orderItemId:2
  }
})
于 2021-03-06T14:37:42.790 回答
2

尝试这个:-

reference: {
              [Op.and]: [{orderItemId: {[Op.eq]: 2}}]
           }
于 2020-06-15T13:32:31.737 回答