$let (집계)
정의
$let
지정된 식에 사용할 변수를 바인딩하고 식의 결과를 반환합니다.
$let
표현식의 구문은 다음과 같습니다.{ $let: { vars: { <var1>: <expression>, ... }, in: <expression> } } 필드사양vars
in
표현식에서 액세스할 수 있는 변수 에 대한 할당 블록입니다. 변수를 할당하려면 변수 이름에 문자열을 지정하고 값에 유효한 표현식을 할당합니다.변수 할당은
in
표현식 외부는 물론vars
블록 자체 내에서도 의미가 없습니다.in
평가할 표현식 입니다.애그리게이션 표현식의 변수에 액세스하려면 변수 이름 앞에 이중 달러 기호(
$$
)를 붙이고 따옴표로 묶습니다. 표현식에 대한 자세한 내용은 표현식 을 참조하세요. 집계 파이프라인에서 변수를 사용하는 방법에 대한 자세한 내용 은 집계 표현식의 변수를 참조하세요.
행동
$let
은 시스템 변수를 포함하여 표현식 블록 외부에 정의된 변수에 액세스할 수 있습니다.
vars
블록에서 외부에서 정의된 변수의 값을 수정하면 새 값은 in
표현식에만 적용됩니다. in
표현식 외부에서 변수는 이전 값을 유지합니다.
vars
할당 블록에서 할당 순서는 중요하지 않으며 변수 할당은 in
표현식 내에서만 의미를 갖습니다. 따라서 vars
할당 블록의 변수 값에 액세스하는 것은 동일한 vars
블록 내부가 아닌 vars
블록 외부에 정의된 변수의 값을 의미합니다.
예를 들어 다음과 같은 $let
표현식을 고려해 보세요.
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
vars
할당 블록에서 "$$low"
는 동일한 vars
블록에 정의된 변수가 아니라 외부에서 정의된 변수 low
의 값을 참조합니다. $let
표현식 블록 외부에 low
가 정의되어 있지 않으면 표현식이 유효하지 않습니다.
예시
다음 문서가 포함된 sales
collection입니다:
{ _id: 1, price: 10, tax: 0.50, applyDiscount: true } { _id: 2, price: 10, tax: 0.25, applyDiscount: false }
다음 집계는 $project
파이프라인 단계에서 $let
을 사용하여 각 문서에 대한 finalTotal
을 계산하고 반환합니다.
db.sales.aggregate( [ { $project: { finalTotal: { $let: { vars: { total: { $add: [ '$price', '$tax' ] }, discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } } }, in: { $multiply: [ "$$total", "$$discounted" ] } } } } } ] )
이 집계는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "finalTotal" : 9.450000000000001 } { "_id" : 2, "finalTotal" : 10.25 }