정의
$switch일련의 대소문자 표현식을 평가합니다.
true으로 평가되는 표현식을 찾으면$switch지정된 표현식을 실행하고 제어 흐름을 중단합니다.$switch의 구문은 다음과 같습니다:$switch: { branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> } branches배열의 객체에는case필드와then필드만 포함되어야 합니다.피연산자설명branches제어 브랜치 문서의 배열입니다. 각 브랜치는 다음과 같은 필드가 있는 문서입니다.
caseboolean로 해석되는 모든 유효한 표현식 일 수 있습니다. 결과가boolean이 아닌 경우 부울 값으로 강제로 적용됩니다. MongoDB 가 표현식을 참 또는 거짓으로 평가하는 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
then- 유효한 모든 표현식이 될 수 있습니다.
branches배열에는 브랜치 문서가 하나 이상 포함되어야 합니다.default선택 사항입니다. 분기
case표현식이true로 평가되지 않는 경우 취할 경로입니다.선택 사항이지만 이 지정되지 않았고
defaultcase참으로 평가되는 분기가$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!" }