$jsonSchema

$jsonSchema 산자는 JSON 스키마 사양에 대해 문서의 유효성을 검사하는 데 사용됩니다. 문서가 미리 정의된 구조, 데이터 형식 및 유효성 검사 규칙을 준수하도록 합니다.

문법

연산자의 $objectToArray 구문은 다음과 같습니다.

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

매개 변수

매개 변수 Description
bsonType 필드가 일치해야 하는 BSON(Binary JSON) 형식을 지정합니다. $type 연산자가 사용하는 문자열 별칭을 허용합니다.
properties 특정 필드에 대한 유효성 검사 규칙을 정의하는 개체입니다.
minimum/maximum 숫자 필드에 대한 숫자 제약 조건입니다.
minLength/maxLength 문자열 길이 제약 조건입니다.
minItems/maxItems 배열 길이 제약 조건입니다.
pattern 문자열 유효성 검사에 대한 정규식 패턴입니다.
items 배열 요소에 대한 스키마 유효성 검사입니다.
uniqueItems 배열 항목이 고유해야 하는지 여부를 나타내는 부울입니다.

지원되는 키워드

DocumentDB는 다음 JSON 스키마 키워드를 지원합니다.

키워드 유형 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 스키마 키워드는 DocumentDB에서 아직 지원되지 않습니다.

키워드 유형 비지원 이유 해결 방법
additionalProperties 개체 구현되지 않음 명시적 properties 정의 사용
allOf 모든 형식 논리 연산자가 지원되지 않음 중첩된 유효성 검사 사용
anyOf 모든 형식 논리 연산자가 지원되지 않음 별도의 쿼리 사용
dependencies 개체 복잡한 종속성 유효성 검사가 지원되지 않음 애플리케이션 논리에서 처리
description N/A 오류 메시지에 표시되지 않을 수 있음 정보 전용
enum 모든 형식 열거형 유효성 검사가 지원되지 않음 대신 연산자 사용 $in
maxProperties 개체 속성 개수 유효성 검사가 지원되지 않음 애플리케이션 논리에서 처리
minProperties 개체 속성 개수 유효성 검사가 지원되지 않음 애플리케이션 논리에서 처리
not 모든 형식 부정 연산자가 지원되지 않음 양수 유효성 검사 규칙 사용
oneOf 모든 형식 논리 연산자가 지원되지 않음 애플리케이션 수준 유효성 검사 사용
patternProperties 개체 패턴 기반 속성 유효성 검사가 지원되지 않음 명시적 속성 이름 사용
title N/A 메타데이터 필드가 처리되지 않음 대신 description를 사용하세요.

예시

데이터 세트를 사용하는 실제 예제를 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: 쿼리 연산자를 사용하여 결합

이 쿼리는 직원 필드가 하나 이상의 정규직 직원 구성원(fullTime ≥ 1) 및 sales.totalSales가 10,000명보다 큰 totalStaff 하위 개체를 포함하는 유효한 개체인 모든 저장소 문서를 검색합니다.

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
  }
]