문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ /

유효하지 않은 문서 처리 방법 선택

이 페이지의 내용

  • 컨텍스트
  • 옵션 1: 유효하지 않은 문서 거부하기
  • 옵션 2: 유효하지 않은 문서는 허용하되 로그에 기록하기
  • 자세히 알아보기

MongoDB가 유효성 검사 규칙을 위반하는 문서를 처리하는 방법을 지정할 수 있습니다. 작업으로 인해 유효하지 않은 문서가 생성되는 경우 MongoDB는 다음 중 하나를 수행할 수 있습니다.

  • 유효성 검사 기준을 위반하는 삽입 또는 업데이트는 모두 거부합니다. 이것이 기본 설정된 동작입니다.

  • 작업을 계속 진행하도록 허용하되, MongoDB 로그에 위반 사항을 기록합니다.

유효하지 않은 문서를 거부하면 스키마가 일관성을 유지할 수 있습니다. 그러나 스키마가 설정되기 이전의 문서가 포함된 데이터 마이그레이션과 같이 특정 시나리오에서는 유효하지 않은 문서를 허용해야 할 수도 있습니다.

스키마의 validationAction 옵션에 따라 MongoDB가 잘못된 문서를 처리하는 방식이 결정됩니다:

유효성 검사 작업
행동
error
(기본)MongoDB는 유효성 검사 기준을 위반하는 모든 삽입 또는 업데이트를 거부합니다.
warn
MongoDB는 작업 진행을 허용하지만 위반 사항을 MongoDB 로그에 기록합니다.

다음 절차에서는 잘못된 문서를 거부하는 스키마 유효성 검사를 생성하는 방법을 보여줍니다.

1

validationAction: "error"이(가) 있는 JSON 스키마 유효성 검사기를 사용하여 contacts 컬렉션을 생성합니다.

db.createCollection( "contacts", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\\.com$",
description: "must be a string and end with '@mongodb.com'"
}
}
} },
validationAction: "error"
} )

error validationAction 때문에 MongoDB는 잘못된 문서를 거부하고 collection에 삽입되는 것을 방지합니다.

2

다음 문서를 삽입하려고 시도합니다:

db.contacts.insertOne(
{ name: "Amanda", email: "amanda@xyz.com" }
)

문서가 유효성 검사 규칙을 위반했기 때문입니다:

  • email 필드가 정규식 패턴과 일치하지 않습니다. email 필드는 @mongodb.com 로 끝나야 합니다.

  • 필수 필드 phone 이 누락되었습니다.

다음 오류와 함께 작업이 실패합니다:

MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("6377cca4aac957f2b77ea955"),
details: {
operatorName: '$jsonSchema',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'email',
description: "must be a string and end with '@mongodb.com'",
details: [
{
operatorName: 'pattern',
specifiedAs: { pattern: '@mongodb\\.com$' },
reason: 'regular expression did not match',
consideredValue: 'amanda@xyz.com'
}
]
}
]
},
{
operatorName: 'required',
specifiedAs: { required: [ 'phone' ] },
missingProperties: [ 'phone' ]
}
]
}
}

다음 절차는 유효하지 않은 문서는 허용하지만 이를 MongoDB 로그에 기록하는 스키마 유효성 검사를 만드는 방법을 보여 줍니다.

1

validationAction: "warn"이(가) 있는 JSON 스키마 유효성 검사기를 사용하여 contacts2 컬렉션을 생성합니다.

db.createCollection( "contacts2", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\\.com$",
description: "must be a string and end with '@mongodb.com'"
}
}
} },
validationAction: "warn"
} )

warn validationAction 은 잘못된 문서를 collection에 삽입할 수 있도록 허용합니다. 유효하지 않은 문서는 MongoDB 로그에 기록됩니다.

2

다음 문서를 삽입하려고 시도합니다:

db.contacts2.insertOne(
{ name: "Amanda", email: "amanda@xyz.com" }
)

문서가 유효성 검사 규칙을 위반했기 때문입니다:

  • email 필드가 정규식 패턴과 일치하지 않습니다. email 필드는 @mongodb.com 로 끝나야 합니다.

  • 필수 필드 phone 이 누락되었습니다.

3

읽기 가능한 형식으로 MongoDB 로그를 보려면 다음 명령을 실행하세요:

db.adminCommand(
{ getLog:'global'} ).log.forEach(x => { print(x) }
)

MongoDB 로그에는 다음 객체와 유사한 항목이 포함되어 있습니다:

{
"t": {
"$date": "2022-11-18T13:30:43.607-05:00"
},
"s": "W",
"c": "STORAGE",
"id": 20294,
"ctx": "conn2",
"msg": "Document would fail validation",
"attr": {
"namespace": "test.contacts2",
"document": {
"_id": {
"$oid": "6377cf53d59841355cac1cd0"
},
"name": "Amanda",
"email": "amanda@xyz.com"
},
"errInfo": {
"failingDocumentId": {
"$oid": "6377cf53d59841355cac1cd0"
},
"details": {
"operatorName": "$jsonSchema",
"schemaRulesNotSatisfied": [{
"operatorName": "properties",
"propertiesNotSatisfied": [{
"propertyName": "email",
"description": "must be a string and end with '@mongodb.com'",
"details": [{
"operatorName": "pattern",
"specifiedAs": {
"pattern": "@mongodb\\.com$"
},
"reason": "regular expression did not match",
"consideredValue": "amanda@xyz.com"
}]
}]
}, {
"operatorName": "required",
"specifiedAs": {
"required": ["phone"]
},
"missingProperties": ["phone"]
}]
}
}
}
}
  • 로그 메시지

  • 기존 문서에 대한 유효성 검사 수준 지정

돌아가기

유효성 검사 수준 지정

다음

우회