쿼리 연산자로 유효성 검사 지정
$eq
및 $gt
와 같은 쿼리 연산자를 사용하여 필드를 비교할 때 유효성 검사 를 지정할 수 있습니다.
쿼리 연산자를 사용한 스키마 검증의 일반적인 사용 사례는 런타임에 여러 필드 값을 비교하는 동적 유효성 검사 규칙을 만들려는 경우입니다. 예를 들어 다른 필드의 값에 종속되는 필드가 있고 해당 값이 서로 정확하게 비례하는지 확인해야 하는 경우입니다.
제한 사항
Context
고객 주문을 추적하는 애플리케이션을 예로 들어 보겠습니다. 주문에는 기본 가격과 VAT 가 있습니다. orders
collection에는 총 가격을 추적하기 위한 다음과 같은 필드가 포함되어 있습니다.
price
VAT
totalWithVAT
단계
다음 절차에서는 쿼리 연산자를 사용하여 스키마 유효성 검사를 만들어 totalWithVAT
가 price
및 VAT
의 예상 조합과 일치하는지 확인합니다.
유효성 검사를 통해 유효하지 않은 문서를 방지하는지 확인합니다.
다음 작업은 totalWithVAT
필드가 올바른 값과 같지 않기 때문에 실패합니다.
db.orders.insertOne( { total: NumberDecimal("141"), VAT: NumberDecimal("0.20"), totalWithVAT: NumberDecimal("169") } )
141 *(1 + 0.20)는 169.2입니다. 따라서 totalWithVAT
필드의 값은 169.2이어야 합니다.
이 작업은 다음 오류를 반환합니다.
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("62bcc9b073c105dde9231293"), details: { operatorName: '$expr', specifiedAs: { '$expr': { '$eq': [ '$totalWithVAT', { '$multiply': [ '$total', { '$sum': [ 1, '$VAT' ] } ] } ] } }, reason: 'expression did not match', expressionResult: false } }
추가 정보
쿼리 연산자 유효성 검사를 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.discountedPrice
lineItems.price
보다 작아야 합니다. 이 규칙은$lt
연산자를 사용하여 지정됩니다.items
필드는 배열이어야 합니다. 이 규칙은$jsonSchema
를 사용하여 지정됩니다.