$switch (집계)
정의
$switch
일련의 대소문자 표현식을 평가합니다.
true
으로 평가되는 표현식을 찾으면$switch
지정된 표현식을 실행하고 제어 흐름을 중단합니다.$switch
의 구문은 다음과 같습니다:$switch: { branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> } branches
배열의 객체에는case
필드와then
필드만 포함되어야 합니다.피연산자설명branches
제어 브랜치 문서의 배열입니다. 각 브랜치는 다음과 같은 필드가 있는 문서입니다.
case
boolean
로 해석되는 모든 유효한 표현식 일 수 있습니다. 결과가boolean
이 아닌 경우 부울 값으로 강제로 적용됩니다. MongoDB 가 표현식을 참 또는 거짓으로 평가하는 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
then
- 유효한 모든 표현식이 될 수 있습니다.
branches
배열에는 브랜치 문서가 하나 이상 포함되어야 합니다.default
선택 사항입니다. 분기
case
표현식이true
로 평가되지 않는 경우 취할 경로입니다.선택 사항이지만 이 지정되지 않았고
default
case
참으로 평가되는 분기가$switch
없으면 는 오류를 반환합니다.
행동
다양한 case 문은 상호 배타적일 필요가 없습니다. $switch
는 true
로 평가되는 첫 번째 분기를 실행합니다. 어느 분기도 참으로 평가되지 않으면 $switch
는 default
옵션을 실행합니다.
다음 조건으로 인해 $switch
가 오류와 함께 실패합니다:
branches
필드가 누락되었거나 항목이 하나 이상 포함된 배열이 아닙니다.branches
배열의 객체에case
필드가 포함되어 있지 않습니다.branches
배열의 객체에then
필드가 포함되어 있지 않습니다.branches
배열의 객체에case
또는then
이외의 필드가 포함되어 있습니다.default
이(가) 지정되지 않았으며true
로 평가되는case
이(가) 없습니다.
예시 | 결과 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||
|
| |||||||||
|
|
예시
grades
라는 이름의 컬렉션에 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "name" : "Susan Wilkes", "scores" : [ 87, 86, 78 ] } { "_id" : 2, "name" : "Bob Hanna", "scores" : [ 71, 64, 81 ] } { "_id" : 3, "name" : "James Torrelio", "scores" : [ 91, 84, 97 ] }
다음 집계 작업은 $switch
를 사용하여 각 학생의 평균 점수를 기반으로 특정 메시지를 표시합니다.
db.grades.aggregate( [ { $project: { "name" : 1, "summary" : { $switch: { branches: [ { case: { $gte : [ { $avg : "$scores" }, 90 ] }, then: "Doing great!" }, { case: { $and : [ { $gte : [ { $avg : "$scores" }, 80 ] }, { $lt : [ { $avg : "$scores" }, 90 ] } ] }, then: "Doing pretty well." }, { case: { $lt : [ { $avg : "$scores" }, 80 ] }, then: "Needs improvement." } ], default: "No scores found." } } } } ] )
이 연산은 다음을 반환합니다:
{ "_id" : 1, "name" : "Susan Wilkes", "summary" : "Doing pretty well." } { "_id" : 2, "name" : "Bob Hanna", "summary" : "Needs improvement." } { "_id" : 3, "name" : "James Torrelio", "summary" : "Doing great!" }