$switch(集計)
定義
$switch
バージョン 3.4 で追加。
一連のケース式を評価します。
true
に評価される式が見つかると、$switch
指定された式を実行し、制御フローを抜け出します。$switch
の構文は次のとおりです。$switch: { branches: [ { case: <expression>, then: <expression> }, { case: <expression>, then: <expression> }, ... ], default: <expression> } branches
配列内のオブジェクトには、case
フィールドとthen
フィールドのみを含める必要があります。オペランド説明branches
default
任意。
true
と評価するブランチcase
式が無い場合に採用するパス。省略可能ですが、
default
が指定されず、true と評価するブランチcase
がない場合、$switch
はエラーを返します。
動作
のさまざまなケース ステートメントは、相互に排他的である必要はありません。 $switch
は、 true
と評価される最初に見つけたブランチを実行します。 どのブランチも true と評価しない場合、 $switch
はdefault
オプションを実行します。
次の条件は、$switch
がエラーで失敗する原因になります。
branches
フィールドが欠落しているか、少なくとも 1 つのエントリを含む配列ではありません。branches
配列内のオブジェクトには、case
フィールドが含まれていません。branches
配列内のオブジェクトには、then
フィールドが含まれていません。branches
配列内のオブジェクトには、case
以外、またはthen
以外のフィールドが含まれています。default
は指定されず、true
と評価されるcase
はありません。
例 | 結果 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
| "less than" | |||||||||
| "Did not match" | |||||||||
| "First 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!" }