Ошибка проверки MongoDB $ jsonSchema в компасе - «Неизвестное ключевое слово $ jsonSchema» - PullRequest
0 голосов
/ 11 января 2020

Я использую вкладку проверки Compass, чтобы вручную ввести проверку $ jsonSchema ниже. К сожалению, он продолжает отображать ошибку «Неизвестное ключевое слово $ jsonSchema: геометрия»

Не уверен, почему эта ошибка отображается, поскольку в качестве ключа используется геометрия.

Любые советы о том, как я могу исправить это пожалуйста?

{
  $jsonSchema: {
    bsonType: "object",
    required: ["properties.Name", "properties.Country", "geometry.type", "geometry.coordinates"],
    properties:{
      Country: {
        bsonType: "string",
        description: "Must be supplied"
      },
      Name: {
        bsonType: "string",
        description: "Must be supplied"
      },
      description: {
        bsonType: "string",
        description: "Optional description"
      }
    },
    geometry: {
      type: {
        bsonType: "string",
        enum: ["Point"],
        description: "Must be Point"
      },
      coordinates: {
        bsonType: ["double"],
        description: "Longitude, Latitude"
      }
    },
    datePosted: {
      bsonType: "date",
      description: "Auto-added field"
    },
    image: {
      bsonType: "string",
      description: "URL of image location"
    }
  }
}

1 Ответ

1 голос
/ 13 февраля 2020

Схема JSON, которую вы предоставили, выглядит не совсем правильно. Ошибка в неизвестном ключевом слове "geometry" заключается в том, что этот атрибут должен описывать одно из ваших свойств. Структура файла схемы JSON является жесткой и имеет жесткую (но, по общему признанию, запутанную) спецификацию c.

Я вижу несколько ошибок в предоставленной вами схеме:

  1. Массив свойств required должен содержать ключи в объекте properties. Так что в вашем случае это должно быть что-то вроде required: ["Name", "Country", "geometry"]
  2. Объекты geometry, datePosted и image должны быть размещены внутри объекта properties.
  3. Само описание объекта geometry должно быть другой схемой JSON (это рекурсивный шаблон).
  4. Что такое тип геометрии? Вы определили его как строку и как перечисление только с одной возможной опцией («Точка»). Enum имеет смысл, только если вы предоставите несколько опций, и их значения заменит указанный тип данных.

Приведенный ниже код протестирован на MongoDB Compass:

{
  $jsonSchema: {
    bsonType: 'object',
    required: [
      'properties.Name',
      'properties.Country',
      'geometry.type',
      'geometry.coordinates'
    ],
    properties: {
      Country: {
        bsonType: 'string',
        description: 'Must be supplied'
      },
      Name: {
        bsonType: 'string',
        description: 'Must be supplied'
      },
      description: {
        bsonType: 'string',
        description: 'Optional description'
      },
      geometry: {
        type: 'object',
        properties: {
          type: {
            'enum': [
              'Point'
            ],
            description: 'Must be Point'
          },
          coordinates: {
            bsonType: [
              'object'
            ],
            description: 'Contains Longitude, Latitude',
            properties: {
              longitude: {
                type: 'number',
                description: 'Decimal representation of longitude'
              },
              latitude: {
                type: 'number',
                description: 'Decimal representation of latitude'
              }
            }
          }
        }
      },
      datePosted: {
        bsonType: 'date',
        description: 'Auto-added field'
      },
      image: {
        bsonType: 'string',
        description: 'URL of image location'
      }
    }
  }
}

Посмотрите на пример в документации: https://docs.mongodb.com/manual/core/schema-validation/

...