序列化:将日期存储在JSON列中,并将其与where子句中的日期进行比较

时间:2019-04-11 22:56:29

标签: node.js sequelize.js

我正在使用PostgreSQL和续集。我有一个模型列“ checkedAt”,用于存储多个日期。我希望能够比较列数据中的不同日期。

此问题是日期不是字符串,而是JSON数据类型,因此日期存储为字符串。

这是我定义模型的方式

typedef int (*functionPointer)  (int ); //this sometimes is typedef int 
typedef float (*functionPointer)  (int ); //or typedef float
//can i "guess" the return type at runtime?
void *handle = dlopen(userLib.so, RTLD_LAZY);
functionPointer func = (functionPointer) dlsym(handle, "foo");
func(2);

我如何尝试查询不成功

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

但不确定是否以及如何将其用于列的属性。

我希望能够通过将Date对象与JSON对象列的属性中的转换值进行比较来查询模型。

1 个答案:

答案 0 :(得分:0)

如果需要将多个日期与一个通知相关联,那么最好创建一个专门用于存储checkedAt日期的新模型,并在通知和checkedAt日期之间创建关联。像Notification.hasMany(Dates);

这样,当您查询通知时,可以包括Dates表,然后具体说明要从该表中包括什么日期,例如使用$lte,这正是您要尝试的。

可能看起来像这样

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