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