MongoDB 3.6 JSON Schema验证调试:如何获取具体错误信息?
如何获取MongoDB JSON Schema验证的详细错误信息
我明白你在MongoDB University课程中遇到的困扰——默认的验证错误提示太笼统,根本没法快速定位问题。别担心,我们可以通过MongoDB内置的命令来获取精准的验证错误,同时我也会帮你排查你当前插入操作失败的具体原因。
第一步:使用jsonSchemaValidate命令获取详细错误
MongoDB 3.6+提供了jsonSchemaValidate命令,专门用来验证文档是否符合指定的JSON Schema,并且会返回具体的验证失败原因。你可以在mongo shell中执行以下命令:
db.runCommand({ jsonSchemaValidate: { schema: { bsonType: "object", properties: { _id: {}, airportCode: { type: "string", minLength: 3 }, airportName: { type: "string" }, airlineName: { type: "string", minLength: 5 }, claims: { bsonType: "object", properties: { itemCategory: { bsonType: "array", maxItems: 3 }, amount: { type: "string", pattern: "^\\$.*" } } } }, required: ["airportCode", "airlineName", "claims"], additionalProperties: false }, document: { "airportCode": "ABE", "airportName": "Lehigh Valley International Airport, Allentown", "airlineName": "MongoAir", "claims": { "claimType": "Property Damage", "claimSite": "Checked Baggage", "itemCategory": [ "Sporting Equipment & Supplies" ], "amount": "$180.00" } } } })
执行后,你会得到类似这样的详细错误输出:
{ "valid" : false, "errors" : [ { "dataPath" : ".claims", "keyword" : "additionalProperties", "message" : "additional property 'claimType' not allowed", "params" : { "additionalProperty" : "claimType" }, "schemaPath" : "#/properties/claims/additionalProperties" }, { "dataPath" : ".claims", "keyword" : "additionalProperties", "message" : "additional property 'claimSite' not allowed", "params" : { "additionalProperty" : "claimSite" }, "schemaPath" : "#/properties/claims/additionalProperties" } ], "ok" : 1 }
这样就能清晰看到哪里出问题了!
第二步:排查你当前的验证失败原因
从你的代码来看,有两个关键问题导致插入失败:
- 额外属性不被允许:你的Schema中设置了
additionalProperties: false,这意味着文档(包括嵌套的claims对象)不能包含Schema里未定义的属性。但你插入的文档里,claims对象有claimType和claimSite这两个Schema中没定义的属性,直接违反了验证规则。 - 正则表达式转义错误:你Schema里
amount的pattern: "^\$.*"存在转义问题——在正则表达式里,$是表示字符串结束的特殊字符,所以你需要把它转义成\\$,正确的写法是pattern: "^\\$.*",这样才能匹配以$开头的金额字符串。
第三步:修复方案
根据你的需求,你可以选择以下两种修复方式:
- 方式一:允许额外属性:如果
claims对象可能包含其他属性,把additionalProperties: false去掉,或者改成true。 - 方式二:补充Schema定义:在
claims的properties里添加claimType和claimSite的定义,比如:claims: { bsonType: "object", properties: { itemCategory: { bsonType: "array", maxItems: 3 }, amount: { type: "string", pattern: "^\\$.*" }, claimType: { type: "string" }, claimSite: { type: "string" } } }
同时记得修正amount的正则表达式转义问题。
内容的提问来源于stack exchange,提问作者Ivan Beldad
相关产品推荐
相关产品推荐

