본문 바로가기
MongoDB/Evaluation Query Operators

[MongoDB] $expr

by 드름이 2022. 7. 1.

요약: 필드 A의 값을 필드 B의 값과 비교하여 기준에 맞는 document를 모두 가져오고 싶을 때 사용


{ "_id" : 1, "카테고리" : "음식", "예산": 400, "지출": 450 }
{ "_id" : 2, "카테고리" : "음료", "예산": 100, "지출": 150 }
{ "_id" : 3, "카테고리" : "옷", "예산": 100, "지출": 50 }
{ "_id" : 4, "카테고리" : "잡비", "예산": 500, "지출": 300 }
{ "_id" : 5, "카테고리" : "여행", "예산": 200, "지출": 650 }

1. 기본 사용법

 

$expr을 사용하여 "지출"이 "예산"을 초과하는( $gt ) 문서를 찾습니다.

 

db.monthlyBudget.find( { $expr: { $gt: [ "$지출" , "$예산" ] } } )

 

위 구문의 결과는 다음과 같습니다.

 

{ "_id" : 1, "카테고리" : "음식", "예산" : 400, "지출" : 450 }
{ "_id" : 2, "카테고리" : "음료", "예산" : 100, "지출" : 150 }
{ "_id" : 5, "카테고리" : "여행", "예산" : 200, "지출" : 650 }

 


2. 응용 

 

A, B에는 다양한 형태의 구문이 들어갈 수 있어서 동적으로 $expr 평가가 실행될 수 있습니다.

{ $expr : { $someOperator : [ A, B ] } }

 

아래의 좀 복잡한 예시를 봅시다.

 

let 할인가 = {
   $cond: {
      if: { $gte: ["$수량", 100] },
      then: { $multiply: ["$가격", NumberDecimal("0.50")] },
      else: { $multiply: ["$가격", NumberDecimal("0.75")] }
   }
};

db.supplies.find( { $expr: { $lt:[ 할인가,  NumberDecimal("5") ] } });

 

"할인가"를 $cond를 통해 조건적으로 결정합니다. 

 

조건적으로 결정된 "할인가"를 NumberDecimal("5")와 비교 평가합니다. 

 

($cond와 $multiply 등은 앞으로 다루게 될 것입니다.)


출처: $expr — MongoDB Manual

'MongoDB > Evaluation Query Operators' 카테고리의 다른 글

[MongoDB] $regex  (0) 2022.07.01
[MongoDB] $mod  (0) 2022.07.01
[MongoDB] $jsonSchema  (0) 2022.07.01