Sequelize, MySQL - фильтрация строк в таблице со значениями столбцов JSON

Нужна помощь в выяснении того, как фильтровать строки в столбце JSON таблицы MySQL с вложенными значениями с помощью Sequelize. В документации его нет (предоставляется только для PostgreSQL и MSSQL - ссылка)

Определение таблицы -

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'

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
0
6 298
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Нужно использовать Sequelize.Op

Пример:

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

Sequelize (Операторы)

Большое спасибо! Сработало отлично. Кроме того, все равно убрать использование буквального?

Himavanth 12.09.2018 10:45

Может использоваться sequelize.col sequelize.where (sequelize.col ('profile-> user.first_name'), {[Op.like]: sequelizeFilters.search,}),

Uladzislau Vavilau 12.09.2018 10:49

Тебе понравился мой ответ? Если да, оцените это.

Uladzislau Vavilau 12.09.2018 12:25

Попробуй это:-

reference: {
              [Op.and]: [{orderItemId: {[Op.eq]: 2}}]
           }

Вы можете использовать ниже.

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

// oR

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

Другие вопросы по теме