JSON 架构日期验证不适合 MongoDB



我正在使用 npmjsonschema模块进行 nodejs,我非常简单的 json 模式如下所示:

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

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

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

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

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

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

还有其他想法吗?

_id

(即 ObjectID(和日期类型的正确类型为:

"bsonType": "objectId" // for ObjectID
"bsonType": "date" // For ISODate

例:

"title": "ticket",
"type": "object",
"properties": {
"_id"    : {"bsonType": "objectId"},
"created": {"bsonType": "date"} 
},
"additionalProperties" : false

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

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

最新更新