类型无误但JSON Schema验证失败,translations子Schema问题咨询
先看你给出的这段Schema定义:
"translations": { "bsonType": "object", "patternProperties": { "id": { "bsonType": "string" }, "^[a-z]{2}$": { "anyOf": [ { "bsonType": "object" }, { "bsonType": "array" } ] } } }
结合你说的「类型正确但验证失败」的情况,我梳理了几个最可能的原因:
1. 对patternProperties的用法理解有误
patternProperties的键必须是正则表达式,用来匹配对象的属性名。你写的"id"会被当成正则^id$——也就是说,只有当属性名**完全等于"id"**时,才会应用"bsonType": "string"的校验规则。
如果你的需求是:translations对象必须包含一个名为id的字符串属性,那应该用properties而非patternProperties,同时配合required数组声明必填项,比如:
"translations": { "bsonType": "object", "properties": { "id": { "bsonType": "string" } }, "patternProperties": { "^[a-z]{2}$": { "anyOf": [ { "bsonType": "object" }, { "bsonType": "array" } ] } }, "required": ["id"] // 如果id是必填的话 }
2. 未显式设置additionalProperties导致额外属性被拦截
MongoDB的BSON Schema中,当使用patternProperties时,如果没有显式声明additionalProperties,默认行为会拒绝所有不匹配patternProperties规则的属性。
举个例子:如果你的translations对象里有一个属性名是"id_123"(不是正好"id"),或者"en-US"(不符合^[a-z]{2}$的正则),这些属性会因为不匹配任何pattern规则而被判定为无效,哪怕它们的类型是正确的。
如果允许存在其他属性,你需要显式添加"additionalProperties": true:
"translations": { "bsonType": "object", "patternProperties": { "id": { "bsonType": "string" }, "^[a-z]{2}$": { "anyOf": [ { "bsonType": "object" }, { "bsonType": "array" } ] } }, "additionalProperties": true }
3. 正则表达式匹配范围不符合实际属性名
你的正则^[a-z]{2}$只匹配两个小写字母的属性名(比如"en"、"fr"),如果你的实际属性名包含大写字母(比如"EN")、长度不是2(比如"eng"),或者带有其他字符(比如"en-GB"),都会不匹配这个规则,导致对应的属性值即使类型正确也会验证失败。
如果需要支持更广泛的语言代码格式,可以调整正则,比如支持大小写:^[a-zA-Z]{2}$,或者支持带地区的格式:^[a-z]{2}(-[A-Z]{2})?$。
4. 可能的隐含校验规则冲突
如果你在父Schema或其他地方对translations设置了额外的校验规则(比如required数组里包含了未定义的属性,或者其他properties规则冲突),也可能导致类型正确但整体验证失败。可以检查一下上层Schema是否有相关约束。
内容的提问来源于stack exchange,提问作者Dorielle

