문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

스키마 유효성 검사 수정

이 페이지의 내용

  • 이 작업에 관한 정보
  • 단계
  • 유효성 검사를 사용하는 컬렉션을 생성합니다.
  • 유효성 검사 스키마를 수정합니다.
  • 결과
  • 잘못된 문서 삽입
  • 유효한 문서 삽입
  • 이전에 유효했던 문서가 더 이상 유효하지 않은 경우 처리
  • 자세히 알아보기

컬렉션에 스키마 유효성 검사를 추가한 후 언제든지 유효성 검사 규칙을 수정할 수 있습니다. 예를 들어, 다음과 같이 결정할 수 있습니다.

  • users 컬렉션의 문서는 이제 이메일 주소를 필요로 하지 않습니다.

  • password 필드의 최소 길이를 8자에서 12자로 늘립니다.

컬렉션의 스키마 유효성 검사를 수정하려면 collMod 명령을 사용하고 validator 객체에서 업데이트된 유효성 검사를 지정합니다.

스키마 검증의 모든 구성 요소를 수정할 수 있으며, 이는 규칙, 검증 수준 및 조치를 포함합니다.

컬렉션의 검증 규칙을 업데이트하면 검증 변경 이전에 삽입한 문서가 더 이상 유효하지 않을 수 있습니다. MongoDB가 이러한 유효하지 않은 문서를 처리하는 방법은 validationLevel에 따라 다릅니다. 기본적으로 MongoDB는 문서가 삽입된 시점에 관계없이 모든 문서에 유효성 검사를 적용합니다.

다음 절차는 유효성 검사 규칙이 있는 컬렉션을 생성한 후 해당 규칙을 수정하는 방법을 설명합니다.

1

users 유효성 검사 규칙을 사용하여 컬렉션을 만듭니다.

db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "username", "password" ],
properties: {
username: {
bsonType: "string",
description: "must be a string and is required"
},
password: {
bsonType: "string",
minLength: 8,
description: "must be a string at least 8 characters long, and is required"
}
}
}
}
} )
2

다음 collMod 명령을 실행하여 password 필드의 minLength를 8에서 12로 변경합니다:

db.runCommand( { collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "username", "password" ],
properties: {
username: {
bsonType: "string",
description: "must be a string and is required"
},
password: {
bsonType: "string",
minLength: 12,
description: "must be a string of at least 12 characters, and is required"
}
}
}
}
} )

collMod명령은 유효성 검증이 없이 생성된 기존 컬렉션에 유효성 검증을 추가하는 데에도 사용할 수 있습니다.

다음 섹션에서는 이러한 시나리오에서 업데이트된 유효성 검사 결과를 보여줍니다:

  • 유효하지 않은 문서를 삽입한 경우.

  • 유효한 문서를 삽입하는 경우.

  • 유효성 검사 규칙 변경으로 인해 이전에 유효했던 문서가 유효하지 않게 된 경우입니다.

다음 작업은 잘못된 문서를 삽입하려고 시도합니다. 최소 길이가 12자일 때 password 필드의 길이가 10자인 문서는 유효하지 않습니다.

db.users.insertOne(
{
"username": "salesAdmin01",
"password": "kT9$j4wg#M"
}
)

MongoDB는 다음 오류를 반환합니다.

MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("62be0adb73c105dde9231299"),
details: {
operatorName: '$jsonSchema',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'password',
description: 'must be a string of at least 8 characters, and is required',
details: [
{
operatorName: 'minLength',
specifiedAs: { minLength: 12 },
reason: 'specified string length was not satisfied',
consideredValue: 'kT9$j4wg#M'
}
]
}
]
}
]
}
}

다음 작업은 password 필드 길이가 12자 이상인 유효한 문서를 삽입합니다.

db.users.insertOne(
{
"username": "salesAdmin01",
"password": "8p&SQd7T90$KKx"
}
)

스키마 검증의 첫 번째 버전에는 유효하지만 두 번째 버전에는 유효하지 않은 다음 문서를 고려하십시오.

db.users.insertOne(
{
"username": "salesAdmin02",
"password": "i8U60*VyL8"
}
)

문서의 password 필드는 10자입니다. 스키마 검증의 첫 번째 버전에서는 최소 8자가 필요했기 때문에 이 문서는 유효합니다. 그러나 password 가 최소 12자가 되도록 유효성 검증을 업데이트한 후에는 이 문서가 유효성을 잃습니다.

스키마 유효성 검증의 변경으로 인해 이전에 유효했던 문서가 유효하지 않게 되면, 그 문서는 컬렉션에 그대로 남아 있게 됩니다.

MongoDB가 새로 유효하지 않게 된 문서를 처리하는 방식은 스키마의 validationLevel에 따라 다릅니다. 이 예제의 스키마 유효성 검사에서는 기본 strictvalidationLevel을 사용하며 이는 문서는 새 유효성 검사 규칙과 일치해야 함을 의미합니다. MongoDB는 문서가 업데이트될 때마다 유효성 검사를 수행합니다.

업데이트된 스키마 유효성 검사의 validationLevelmoderate인 경우 이 문서는 새 유효성 검사 규칙과 일치할 필요가 없습니다.

← 기존 유효성 검사 규칙 보기