Sequelize: сохранение дат в столбцах JSON и сравнение их с датами в предложениях where

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

Я использую PostgreSQL и sequelize. У меня есть столбец модели «checkedAt» для хранения нескольких дат. Я хочу иметь возможность сравнивать разные даты из данных столбца.

Проблема заключается в том, что даты хранятся в виде строк, поскольку это не дата, а тип данных JSON.

Вот как я определил модель

 const Notification = sequelize.define("Notification", {
    checkedAt: {
      type: DataTypes.JSON,
      defaultValue: {
        bySomeJob: new Date(),
        bySomeOtherJob: new Date()
      }
    }
});
  

как я безуспешно пытаюсь выполнить запрос

 const someDate = new Date();

await db.Notification.findAll({
   where: {
     checkedAt: {
        bySomeJob: {
            $lte: someDate
        }
     }
   }
});
  

Я использовал этот метод раньше для целых и логических значений, но не с датой.

Я нашел эту функцию для преобразования строк в формат даты

 sequelize.fn('date', sequelize.col('checkedAt'))
  

Но не уверен, можно ли и как это использовать для свойства столбца.

Я ожидаю, что смогу запрашивать модель, сравнивая объект Date с преобразованным значением из свойства столбца объекта JSON.

Ответ №1:

Если вам нужно связать несколько дат с уведомлением, то вам может быть лучше создать новую модель, используемую специально для хранения checkedAt дат, и создать связь между уведомлениями и датами checkedAt. Что-то вроде Notification.hasMany(Dates);

Таким образом, когда вы запрашиваете уведомления, вы можете включить Dates таблицу, а затем указать, какие даты включать из этой таблицы, как при использовании $lte , что вы и пытались.

Это может выглядеть примерно так

 await db.Notification.findAll({
    include: [
        {
            model: db.Date,
            where: {
                checkedAt: {
                    bySomeJob: {
                        $lte: someDate
                    }
                }
            }
        }
    ]
});