json架构日期验证不适合mongodb

时间:2017-08-15 14:44:30

标签: mongodb jsonschema

我正在为nodejs使用npm jsonschema模块,我的非常简单的json架构如下所示:

    "title": "ticket",
    "type": "object",
    "properties": {
        "_id"    : {"type": "string"},
        "created": {"type": "string", "format": "date-time"} 
    },
    "additionalProperties" : false

我通过此架构验证的数据存储在mongodb中。问题是创建的属性有一个带有expireAfterSeconds的索引,可以在一定的时间后自动删除这些记录。

现在我有以下问题。如果我发送一个字符串(无论它是否有效或根据json规范无效),数据库中的文档也创建了类型字符串的属性,因为mongo db是无模式的,我不能预定义该属性作为日期类型。例如,如果我将带有created属性的数据作为2017-08-15T14:34:18.839Z ISO字符串发送,尽管mongo日期属性看起来非常相似,但它们仍然是字符串。 Ofc打破了过期逻辑。

如果我使用创建的属性的实际日期发送我的数据,则JSON验证将失败并显示

instance.created is not of a type(s) string

Ofc我可以转换插入的所有日期字段并从验证字符串更新到日期类型,但这还不够,因为在读取时我会得到具有实际日期类型的数据,这些数据在下次更新时将无法通过验证。所以我可以在每个从日期到字符串的读取中包含一个反向转换,但这个解决方案对我来说还不够好。

还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

不熟悉jsonschema,但是如果您要使用ajv,则可以使用自定义关键字和验证,例如:

{
  "type": "object",
  "properties": {
    "someDate": {
      "instanceof": "Date"
    }
  }
}