文档菜单
文档首页
/
MongoDB 手册
/ / /

JSON Schema 验证的技巧

本页内容

  • _id 字段和 additionalProperties: false
  • null 字段值的验证
  • 加密字段的验证

本页描述了 JSON schema 验证的最佳实践,以帮助避免常见问题。

当你在 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 作为有效的 BSON 类型。

例如,此模式验证不允许 storeLocationnull 的文档

db.createCollection("sales",
{
validator:
{
"$jsonSchema": {
"properties": {
"storeLocation": { "bsonType": "string" }
}
}
}
}
)

具有前面的验证,此文档被拒绝

db.store.insertOne( { storeLocation: null } )

或者,此模式验证允许 storeLocationnull

db.createCollection("store",
{
validator:
{
"$jsonSchema": {
"properties": {
"storeLocation": { "bsonType": [ "null", "string" ] }
}
}
}
}
)

具有前面的验证,此文档被允许

db.store.insertOne( { storeLocation: null } )

注意

与缺失字段相比的 null 字段

null 字段值与缺失字段不同。如果一个字段在文档中缺失,MongoDB 不会验证该字段。

如果您已启用了客户端字段级加密可查询加密,则验证受到以下限制

  • 对于 CSFLE,在运行 collMod 时,libmongocrypt 库优先考虑命令中指定的 JSON 加密模式。这使得可以在尚未具有模式的集合上设置模式。

  • 对于可查询加密,任何包含加密字段的 JSON 模式都会导致查询分析错误。

返回

指定字段值