JSON Schema 验证的技巧
本页描述了 JSON schema 验证的最佳实践,以帮助避免常见问题。
_id
字段和 additionalProperties: false
当你在 JSON schema 中指定 additionalProperties: false
时,MongoDB 会拒绝包含不在 schema 的 properties
对象中的字段的文档。
因为所有对象都包含一个自动生成的 _id
字段,所以当你设置 additionalProperties: false
时,你必须将 _id
字段包含在你的 properties
对象中。如果不包含,则所有文档都会被拒绝。
例如,使用此验证,没有文档是有效的
{ "$jsonSchema": { "required": [ "_id", "storeLocation" ], "properties": { "storeLocation": { "bsonType": "string" } }, "additionalProperties": false } }
此验证确保 storeLocation
是一个字符串。然而,properties
对象中不包含 _id
字段。
要允许集合中的文档,你必须更新 properties
对象以包含 _id
字段
{ "$jsonSchema": { "required": [ "_id", "storeLocation" ], "properties": { "_id": { "bsonType": "objectId" }, "storeLocation": { "bsonType": "string" } }, "additionalProperties": false } }
null
字段值的验证
您的应用程序可能被配置为将缺失的字段值设置为 null
,而不是在发送到集合的对象中不包括这些字段。
如果您的模式为字段验证数据类型,要插入具有该字段 null
值的文档,您必须显式允许 null
作为有效的 BSON 类型。
例如,此模式验证不允许 storeLocation
为 null
的文档
db.createCollection("sales", { validator: { "$jsonSchema": { "properties": { "storeLocation": { "bsonType": "string" } } } } } )
具有前面的验证,此文档被拒绝
db.store.insertOne( { storeLocation: null } )
或者,此模式验证允许 storeLocation
的 null
值
db.createCollection("store", { validator: { "$jsonSchema": { "properties": { "storeLocation": { "bsonType": [ "null", "string" ] } } } } } )
具有前面的验证,此文档被允许
db.store.insertOne( { storeLocation: null } )
注意
与缺失字段相比的 null 字段
null
字段值与缺失字段不同。如果一个字段在文档中缺失,MongoDB 不会验证该字段。
加密字段的验证
如果您已启用了客户端字段级加密 或 可查询加密,则验证受到以下限制
对于 CSFLE,在运行
collMod
时,libmongocrypt 库优先考虑命令中指定的 JSON 加密模式。这使得可以在尚未具有模式的集合上设置模式。对于可查询加密,任何包含加密字段的 JSON 模式都会导致查询分析错误。