유효하지 않은 문서 처리 방법 선택
MongoDB가 유효성 검사 규칙을 위반하는 문서를 처리하는 방법을 지정할 수 있습니다. 작업으로 인해 유효하지 않은 문서가 생성되는 경우 MongoDB는 다음 중 하나를 수행할 수 있습니다.
유효성 검사 기준을 위반하는 삽입 또는 업데이트는 모두 거부합니다. 이것이 기본 설정된 동작입니다.
작업을 계속 진행하도록 허용하되, MongoDB 로그에 위반 사항을 기록합니다.
유효하지 않은 문서를 거부하면 스키마가 일관성을 유지할 수 있습니다. 그러나 스키마가 설정되기 이전의 문서가 포함된 데이터 마이그레이션과 같이 특정 시나리오에서는 유효하지 않은 문서를 허용해야 할 수도 있습니다.
Context
스키마의 validationAction
옵션에 따라 MongoDB가 잘못된 문서를 처리하는 방식이 결정됩니다:
유효성 검사 작업 | 행동 |
---|---|
error | (기본)MongoDB는 유효성 검사 기준을 위반하는 모든 삽입 또는 업데이트를 거부합니다. |
warn | MongoDB는 작업 진행을 허용하지만 위반 사항을 MongoDB 로그에 기록합니다. |
옵션 1: 유효하지 않은 문서 거부하기
다음 절차에서는 잘못된 문서를 거부하는 스키마 유효성 검사를 생성하는 방법을 보여줍니다.
을(를) 사용하여 컬렉션 validationAction: "error"
을 만듭니다.
validationAction: "error"
이(가) 있는 JSON schema 유효성 검사기를 사용하여 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에 삽입되는 것을 방지합니다.
잘못된 문서를 삽입하려고 합니다.
다음 문서를 삽입하려고 시도합니다:
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' ] } ] } }
옵션 2: 유효하지 않은 문서는 허용하되 로그에 기록하기
다음 절차는 유효하지 않은 문서는 허용하지만 이를 MongoDB 로그에 기록하는 스키마 유효성 검사를 만드는 방법을 보여 줍니다.
을(를) 사용하여 컬렉션 validationAction: "warn"
을 만듭니다.
validationAction: "warn"
이(가) 있는 JSON schema 유효성 검사기를 사용하여 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 로그에 기록됩니다.
잘못된 문서가 있는지 로그를 확인합니다.
읽기 가능한 형식으로 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"] }] } } } }