【问题标题】:Mongo 3.6 debug validation using jsonSchemaMongo 3.6 使用 jsonSchema 调试验证
【发布时间】:2018-01-30 11:19:45
【问题描述】:

我正在学习 mongodb 大学的课程,以学习 3.6 版中的新功能,但我无法解决我的验证器无效的原因。

这就是我创建集合的方式:

db.getSiblingDB("TSA").createCollection("claims", {
    validator: {
        $jsonSchema: {
            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
        }
    }
})

然后,我尝试插入这个对象:

db.getSiblingDB("TSA").claims.insertOne({
    "airportCode": "ABE",
    "airportName": "Lehigh Valley International Airport, Allentown",
    "airlineName": "MongoAir",
    "claims": {
        "claimType": "Property Damage",
        "claimSite": "Checked Baggage",
        "itemCategory": [ "Sporting Equipment & Supplies" ],
        "amount": "$180.00"
    }
})

得到以下错误:

WriteError({
    "index" : 0,
    "code" : 121,
    "errmsg" : "Document failed validation",
    "op" : {
        "_id" : ObjectId("5a705318d3d6c18337f07282"),
        "airportCode" : "ABE",
        "airportName" : "Lehigh Valley International Airport, Allentown",
        "airlineName" : "MongoAir",
        "claims" : {
            "claimType" : "Property Damage",
            "claimSite" : "Checked Baggage",
            "itemCategory" : [
                    "Sporting Equipment & Supplies"
            ],
            "amount" : "$180.00"
        }
    }
})

我的问题是,有没有办法像“属性 X 必须是 Y 类型”那样调试验证器,而不是获得通用的“文档验证失败”?

【问题讨论】:

  • 问题是你的pattern。它应该是“^\\$.*”。

标签: mongodb jsonschema mongodb-3.6


【解决方案1】:

从 MongoDB 3.6 开始,没有反馈机制可以告知文档的哪一部分在服务器端检查期间验证失败。相应的功能请求已打开:SERVER-20547: Expose the reason an operation fails document validation。目前,如果需要详细的反馈,则留给应用程序代码执行自己的验证。

【讨论】:

  • 我正在搜索但没有看到该链接。谢谢你。
【解决方案2】:

如果您使用正则表达式模式字符串,反斜杠本身也必须转义:

db.getSiblingDB("TSA").createCollection("claims", {
    validator: {
        $jsonSchema: {
            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
        }
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多