ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

JSON Schema 유효성 검사 지정

JSON Schema는 JSON 문서에 주석을 달고 유효성을 검사할 수 있는 어휘입니다. JSON schema를 사용하여 사람이 읽을 수 있는 형식으로 필드에 대한 유효성 검사 규칙을 지정할 수 있습니다.

다음 환경에서 호스팅되는 배포에 JSON schema 유효성 검사를 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

MongoDB는 핵심 사양유효성 검사 사양을 비롯한 JSON Schema 4 초안을 지원하지만, 몇 가지 차이점이 있습니다. 자세한 내용은 확장생략을 참조하세요.

JSON Schema에 대한 자세한 내용은 공식 웹사이트를 참조하세요.

다음의 스키마 유효성 검사를 지정할 수 없습니다:

collection에서 클라이언트 측 필드 수준 암호화 또는 Queryable Encryption 을 활성화한 경우 유효성 검사에는 다음 제한 사항이 적용됩니다.

  • CSFLE의 경우 collMod를 실행할 때 libmongocrypt 라이브러리는 명령에 지정된 JSON 암호화 스키마를 선호합니다. 이렇게 하면 아직 스키마가 없는 컬렉션에 스키마를 설정할 수 있습니다.

  • Queryable Encryption의 경우 암호화된 필드를 포함하는 JSON schema로 인해 쿼리 분석 오류가 발생합니다.

이 예에서는 students 유효성 검사 규칙이 있는 컬렉션을 만들고 유효하지 않은 문서를 삽입하려고 시도한 후 결과를 관찰합니다.

1

mongosh를 사용하여 로컬 MongoDB 인스턴스 또는 MongoDB Atlas 배포서버에 연결하려면 배포서버에 연결 또는 mongosh를 통해 연결의 단계를 참조하세요.

2

mongosh에서 다음 명령을 실행하여 students 컬렉션을 만들고 $jsonSchema 연산자를 사용하여 스키마 유효성 검사 규칙을 설정합니다.

db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
title: "Student Object Validation",
required: [ "address", "major", "name", "year" ],
properties: {
name: {
bsonType: "string",
description: "'name' must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "'year' must be an integer in [ 2017, 3017 ] and is required"
},
gpa: {
bsonType: [ "double" ],
description: "'gpa' must be a double if the field exists"
}
}
}
}
} )

제목 및 설명 필드로 규칙 명확히 하기

규칙이 명확하지 않은 경우 titledescription 필드를 사용하여 유효성 검사 규칙에 대한 설명을 제공할 수 있습니다. 문서가 유효성 검사에 실패하면 MongoDB는 오류 출력에 이러한 필드를 포함합니다.

3

다음 명령을 실행합니다. 삽입 작업이 실패하는 이유는 gpa 필드가 정수형태인데, validator가 이 필드를 double형태로 요구하기 때문입니다.

db.students.insertOne( {
name: "Alice",
year: Int32( 2019 ),
major: "History",
gpa: Int32(3),
address: {
city: "NYC",
street: "33rd Street"
}
} )
MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("630d093a931191850b40d0a9"),
details: {
operatorName: '$jsonSchema',
title: 'Student Object Validation',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'gpa',
description: "'gpa' must be a double if the field exists",
details: [
{
operatorName: 'bsonType',
specifiedAs: { bsonType: [ 'double' ] },
reason: 'type did not match',
consideredValue: 3,
consideredType: 'int'
}
]
}
]
}
]
}
}
4

gpa 필드 값을 double 유형으로 변경하면 삽입 연산이 성공합니다. 다음 명령을 실행하여 유효한 문서를 삽입하세요.

db.students.insertOne( {
name: "Alice",
year: NumberInt(2019),
major: "History",
gpa: Double(3.0),
address: {
city: "NYC",
street: "33rd Street"
}
} )
5

문서가 성공적으로 삽입되었는지 확인하려면 다음 명령을 실행하여 students 컬렉션을 쿼리합니다.

db.students.find()
[
{
_id: ObjectId("62bb413014b92d148400f7a5"),
name: 'Alice',
year: 2019,
major: 'History',
gpa: 3,
address: { city: 'NYC', street: '33rd Street' }
}
]

Atlas 배포에 연결되어 있는 경우, Atlas UI에서 문서를 보고 필터링할수도 있습니다.

JSON Schema 유효성 검사와 쿼리 연산자 유효성검사를 결합할 수 있습니다.

예를 들어 이 스키마 유효성 검사를 사용하는 sales 컬렉션을 생각해 보겠습니다.

db.createCollection("sales", {
validator: {
"$and": [
// Validation with query operators
{
"$expr": {
"$lt": ["$lineItems.discountedPrice", "$lineItems.price"]
}
},
// Validation with JSON Schema
{
"$jsonSchema": {
"properties": {
"items": { "bsonType": "array" }
}
}
}
]
}
}
)

sales 컬렉션의 문서에 대해 다음과 같은 규칙을 적용하는 유효성 검사가 이루어집니다:

  • lineItems.discountedPricelineItems.price보다 작아야 합니다. 이 규칙은 $lt 연산자를 사용하여 지정됩니다.

  • items 필드는 배열이어야 합니다. 이 규칙은 $jsonSchema를 사용하여 지정됩니다.