$jsonSchema

Оператор $jsonSchema используется для проверки документов в спецификации схемы JSON. Это гарантирует, что документы соответствуют предопределенной структуре, типам данных и правилам проверки.

Syntax

Синтаксис оператора $isArray выглядит следующим образом:

db.createCollection("collectionName", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["field1", "field2"],
      properties: {
        field1: {
          bsonType: "string",
        },
        field2: {
          bsonType: "int",
          minimum: 0,
          description: "Description of field2 requirements"
        }
      }
    }
  },
  validationLevel: "strict", // Optional: "strict" or "moderate"
  validationAction: "error"   // Optional: "error" or "warn"
})

Parameters

Parameter Description
bsonType Указывает типы двоичного JSON (BSON), которые должны соответствовать полю. Принимает псевдонимы строк, используемые оператором $type.
properties Объект, определяющий правила проверки для определенных полей.
minimum/maximum Числовые ограничения для полей чисел.
minLength/maxLength Ограничения длины строки.
minItems/maxItems Ограничения длины массива.
pattern Шаблон регулярного выражения для проверки строки.
items Проверка схемы для элементов массива.
uniqueItems Логическое значение, указывающее, должны ли элементы массива быть уникальными.

Поддерживаемые ключевые слова

Azure DocumentDB поддерживает следующие ключевые слова схемы JSON:

Keyword Тип Description Usage
additionalItems массивы Схема для дополнительных элементов массива Расширенная проверка массива
bsonType все типы Расширение MongoDB — принимает псевдонимы типов BSON "string", "int", "double""object""array""bool""date"
exclusiveMinimum числа Эксклюзивная минимальная граница Расширенная числовая проверка
exclusiveMaximum числа Эксклюзивная максимальная граница Расширенная числовая проверка
items массивы Схема элементов массива Проверка элемента Массива
minimum числа Минимальное ограничение значений Числовая проверка
maximum числа Максимальное ограничение значений Числовая проверка
minItems массивы Минимальная длина массива Проверка размера массива
maxItems массивы Максимальная длина массива Проверка размера массива
multipleOf числа Значение должно быть нескольким из указанного числа. Математические ограничения
minLength Строки Минимальная длина строки Проверка строки
maxLength Строки Максимальная длина строки Проверка строки
pattern Строки Сопоставление шаблонов регулярных выражений Проверка формата строки
properties Объектов Определение правил проверки для полей объектов Определение схемы для вложенных объектов
required Объектов Массив обязательных имен полей Принудительное применение обязательных полей
type все типы Стандартные типы схем JSON "object", , "array""number""boolean""string","null"
uniqueItems массивы Принудительное применение уникальных элементов массива Целостность данных

Неподдерживаемые ключевые слова

Эти ключевые слова схемы JSON еще не поддерживаются в Azure DocumentDB:

Keyword Тип Причина не поддерживается Обходной путь
additionalProperties Объектов Не реализовано Использование явных properties определений
allOf все типы Логический оператор не поддерживается Использование вложенной проверки
anyOf все типы Логический оператор не поддерживается Использование отдельных запросов
dependencies Объектов Сложная проверка зависимостей не поддерживается Обработка в логике приложения
description N/A Может не отображаться в сообщениях об ошибках Только информационные
enum все типы Проверка перечисления не поддерживается Вместо этого используйте $in оператор
maxProperties Объектов Проверка счетчика свойств не поддерживается Обработка в логике приложения
minProperties Объектов Проверка счетчика свойств не поддерживается Обработка в логике приложения
not все типы Оператор отрицания не поддерживается Использование правил положительной проверки
oneOf все типы Логический оператор не поддерживается Использование проверки на уровне приложения
patternProperties Объектов Проверка свойств на основе шаблонов не поддерживается Использование явных имен свойств
title N/A Поле метаданных не обработано Вместо нее следует использовать description.

Examples

Рассмотрим практические примеры с помощью stores набора данных:

{
  "_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
  "name": "First Up Consultants | Bed and Bath Center - South Amir",
  "location": {
    "lat": 60.7954,
    "lon": -142.0012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 18,
      "partTime": 17
    }
  },
  "sales": {
    "totalSales": 37701,
    "salesByCategory": [
      {
        "categoryName": "Mattress Toppers",
        "totalSales": 37701
      }
    ]
  }
}

Пример 1. Базовая проверка структуры

Этот запрос извлекает все хранилища с именами от 5 до 100 символов, и географические координаты попадают в допустимые диапазоны: широта между -90 и 90 и долготой между -180 и 180.

db.stores.find({
  $jsonSchema: {
    bsonType: "object",
    properties: {
      _id: {
        bsonType: "string"
      },
      name: {
        bsonType: "string",
        minLength: 5,
        maxLength: 100
      },
      location: {
        bsonType: "object",
        properties: {
          lat: {
            bsonType: "double",
            minimum: -90,
            maximum: 90
          },
          lon: {
            bsonType: "double",
            minimum: -180,
            maximum: 180
          }
        }
      }
    }
  }
}).limit(1)

Пример 2. Проверка продаж с элементами массива

Этот запрос извлекает все документы магазина, в которых поле продаж является допустимым объектом, содержащим не отрицательное значение totalSales и массив salesByCategory по крайней мере с одним элементом.

db.stores.find({
  $jsonSchema: {
    bsonType: "object",
    properties: {
      sales: {
        bsonType: "object",
        properties: {
          totalSales: {
            bsonType: "int",
            minimum: 0
          },
          salesByCategory: {
            bsonType: "array",
            minItems: 1,
            items: {
              bsonType: "object",
              properties: {
                categoryName: {
                  bsonType: "string",
                  minLength: 1
                },
                totalSales: {
                  bsonType: "int",
                  minimum: 0
                }
              }
            }
          }
        }
      }
    }
  }
}).limit(1)

Этот запрос должен возвращать следующие выходные данные:

[
  {
    _id: 'new-store-001',
    name: 'Adatum Corporation - Downtown Branch',
    sales: { totalSales: 5000 },
    createdDate: ISODate('2025-06-11T11:11:32.262Z'),
    status: 'new',
    staff: { totalStaff: { fullTime: 0, partTime: 0 } },
    version: 1,
    storeOpeningDate: ISODate('2025-06-11T11:11:32.262Z'),
    storeFeatures: 213
  }
]

Пример 3. Объединение с операторами запросов

Этот запрос извлекает все документы магазина, где поле персонала является допустимым объектом, включающим подобъект TotalStaff с по крайней мере одним сотрудником полного времени (fullTime ≥ 1) и sales.totalSales больше 10 000.

db.stores.find({
  $and: [
    {
      $jsonSchema: {
        properties: {
          staff: {
            bsonType: "object",
            properties: {
              totalStaff: {
                bsonType: "object",
                properties: {
                  fullTime: {
                    bsonType: "int",
                    minimum: 1
                  }
                }
              }
            }
          }
        }
      }
    },
    // Additional query constraints
    {
      "sales.totalSales": { $gt: 10000 }
    }
  ]
}).limit(1)

Этот запрос возвращает следующий результат:

[
  {
    _id: 'future-electronics-001',
    address: { city: 'New Tech City' },
    name: 'Boulder Innovations - Future Electronics Hub',
    sales: { totalSales: 25000 },
    establishedDate: ISODate('2025-06-11T11:14:23.147Z'),
    categories: [ 'electronics', 'gadgets', 'smart-home' ],
    promotionEvents: [],
    ratings: { average: 0, count: 0, reviews: [] },
    inventory: {
      lastUpdated: ISODate('2025-06-11T11:14:23.147Z'),
      totalItems: 0,
      lowStockAlerts: []
    },
    storeOpeningDate: ISODate('2025-06-11T11:11:32.262Z'),
    storeFeatures: 120
  }
]