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

쿼리 연산자로 유효성 검사 지정

이 페이지의 내용

  • 제한 사항
  • 컨텍스트
  • 단계
  • 추가 정보
  • 자세히 알아보기

$eq$gt 와 같은 쿼리 연산자를 사용하여 필드를 비교할 때 유효성 검사를 지정할 수 있습니다.

쿼리 연산자를 사용한 스키마 검증의 일반적인 사용 사례는 런타임에 여러 필드 값을 비교하는 동적 유효성 검사 규칙을 만들려는 경우입니다. 예를 들어 다른 필드의 값에 종속되는 필드가 있고 해당 값이 서로 정확하게 비례하는지 확인해야 하는 경우입니다.

고객 주문을 추적하는 애플리케이션을 예로 들어 보겠습니다. 주문에는 기본 가격과 VAT 가 있습니다. orders collection에는 총 가격을 추적하기 위한 다음과 같은 필드가 포함되어 있습니다.

  • price

  • VAT

  • totalWithVAT

다음 절차에서는 쿼리 연산자를 사용하여 스키마 유효성 검사를 만들어 totalWithVATpriceVAT의 예상 조합과 일치하는지 확인합니다.

1

스키마 유효성 검사를 사용하여 orders 컬렉션을 만듭니다.

db.createCollection( "orders",
{
validator: {
$expr:
{
$eq: [
"$totalWithVAT",
{ $multiply: [ "$total", { $sum:[ 1, "$VAT" ] } ] }
]
}
}
}
)

이 유효성 검사를 사용하면 totalWithVAT 필드가 total * (1 + VAT)인 경우에만 문서를 삽입할 수 있습니다.

2

다음 작업은 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
}
}
3

올바른 totalWithVAT 값을 갖도록 문서를 업데이트하면 작업이 성공합니다.

db.orders.insertOne( {
total: NumberDecimal("141"),
VAT: NumberDecimal("0.20"),
totalWithVAT: NumberDecimal("169.2")
} )

MongoDB는 삽입에 성공했음을 나타내는 다음 출력을 반환합니다.

{
acknowledged: true,
insertedId: ObjectId("6304f4651e52f124b84479ba")
}

쿼리 연산자 유효성 검사를 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를 사용하여 지정됩니다.

  • MongoDB에서 사용할 수 있는 모든 쿼리 연산자는 쿼리 선택기를 참조하세요.

  • 쿼리 언어 내에서 집계 표현식을 사용할 수 있는 $expr 연산자에 대한 자세한 내용은 $expr을 참조하세요.

← JSON Schema 유효성 검사 팁