Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$switch(集計)

項目一覧

  • 定義
  • 動作
$switch

バージョン 3.4 で追加

一連のケース式を評価します。trueに評価される式が見つかると、 $switch指定された式を実行し、制御フローを抜け出します。

$switch の構文は次のとおりです。

$switch: {
branches: [
{ case: <expression>, then: <expression> },
{ case: <expression>, then: <expression> },
...
],
default: <expression>
}

branches 配列内のオブジェクトには、case フィールドと then フィールドのみを含める必要があります。

オペランド
説明

branches

制御ブランチ ドキュメントの配列。各ブランチは、次のフィールドを持つドキュメントです。

  • case
    booleanに変換される有効なであればどれでもかまいません。 結果がbooleanでない場合は、強制的にブール値になります。 MongoDB が式を true または false として評価する方法の詳細については、 こちら をご覧ください。
  • then
    任意の有効なを指定できます。

branches 配列には少なくとも 1 つのブランチ ドキュメントが含まれる必要があります。

default

任意。true と評価するブランチ case 式が無い場合に採用するパス。

省略可能ですが、default caseが指定されず、 が true と評価するブランチ がない場合、$switch はエラーを返します。

のさまざまなケース ステートメントは、相互に排他的である必要はありません。 $switchは、 trueと評価される最初に見つけたブランチを実行します。 どのブランチも true と評価しない場合、 $switchdefaultオプションを実行します。

次の条件は、$switch がエラーで失敗する原因になります。

  • branches フィールドが欠落しているか、少なくとも 1 つのエントリを含む配列ではありません。

  • branches 配列内のオブジェクトには、case フィールドが含まれていません。

  • branches 配列内のオブジェクトには、then フィールドが含まれていません。

  • branches 配列内のオブジェクトには、 case 以外、または then 以外のフィールドが含まれています。

  • default は指定されず、true と評価されるcase はありません。

結果
{
$switch: {
branches: [
{ case: { $eq: [ 0, 5 ] }, then: "equals" },
{ case: { $gt: [ 0, 5 ] }, then: "greater than" },
{ case: { $lt: [ 0, 5 ] }, then: "less than" }
]
}
}

"less than"

{
$switch: {
branches: [
{ case: { $eq: [ 0, 5 ] }, then: "equals" },
{ case: { $gt: [ 0, 5 ] }, then: "greater than" }
],
default: "Did not match"
}
}

"Did not match"

{
$switch: {
branches: [
{ case: "this is true", then: "first case" },
{ case: false, then: "second case" }
],
default: "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!" }

Tip

以下も参照してください。

戻る

$sum

項目一覧