요약: 필드 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 등은 앞으로 다루게 될 것입니다.)
'MongoDB > Evaluation Query Operators' 카테고리의 다른 글
[MongoDB] $regex (0) | 2022.07.01 |
---|---|
[MongoDB] $mod (0) | 2022.07.01 |
[MongoDB] $jsonSchema (0) | 2022.07.01 |