Проверка отладки Mongo 3.6 с использованием jsonSchema

Я изучаю новый курс в университете 3.6, чтобы узнать о новых возможностях в версии 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-типа" вместо получения универсального "документа не удалось проверить"?

2 ответа

Решение

Начиная с MongoDB 3.6, отсутствует механизм обратной связи, который бы сообщал, какая часть документа не прошла проверку во время проверки на стороне сервера. Открыт соответствующий запрос функции: SERVER-20547: Укажите причину, по которой операция не проходит проверку документа. На данный момент это оставлено на усмотрение кода приложения, если требуется детальная обратная связь.

Если вы используете шаблонную строку регулярного выражения, сам обратный слеш тоже должен быть экранирован:

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
        }
    }
})
Другие вопросы по тегам