定義
- $getField
- バージョン 5.0 で追加 - ドキュメントから指定したフィールドの値を返します。 オブジェクトを指定しない場合、 - $getFieldは- $$CURRENTからフィールドの値を返します。- $getFieldを使用すると、名前にピリオド(- .)が含まれるフィールドやドル記号(- $)で始まるフィールドの値を取得できます。- Tip- 名前にドル記号( - $)またはピリオド(- .)が含まれるフィールドを追加または更新するには、- $setFieldを使用します。
構文
$getField  の構文は次のとおりです。
{   $getField: {     field: <String>,     input: <Object>   } } 
| フィールド | タイプ | 説明 | 
|---|---|---|
| 
 | 文字列 | |
| 
 | オブジェクト | 
$getFieldには、 $$CURRENTからフィールド値を取得するための次の短縮構文があります。
{   $getField: <String> } 
この構文では、引数は上記の field の値と同じになります。
動作
- fieldが string 定数以外に解決される場合、- $getFieldはエラーを返します。
- 指定した - fieldが- inputオブジェクトにない場合、または- inputオブジェクトを指定していない場合は、- $$CURRENTにない場合、- $getFieldは- missingを返します。
- inputが- missing、- undefined、または- nullと評価された場合、- $getFieldは- nullを返します。
- inputがオブジェクト以外のオブジェクト(- missing、- undefined、または- null)以外と評価された場合、- $getFieldはエラーを返します。
- $getFieldは、オブジェクトまたは配列を暗黙的にトラバースすることはありません。たとえば、- $getFieldは、- a.b.cの- field値を、ネストされたフィールド- { a: { b: { c: } } }ではなく、最上位フィールド- a.b.cとして評価します。
例
ピリオドを含むクエリ フィールド(. )
以下のドキュメントを持つinventoryコレクションを検討してください。
db.inventory.insertMany( [    { _id: 1, item: "sweatshirt", "price.usd": 45.99, qty: 300 },    { _id: 2, item: "winter coat", "price.usd": 499.99, qty: 200 },    { _id: 3, item: "sun dress", "price.usd": 199.99, qty: 250 },    { _id: 4, item: "leather boots", "price.usd": 249.99, qty: 300 },    { _id: 5, item: "bow tie", "price.usd": 9.99, qty: 180 } ] ) 
次の操作では、 $getField演算子と$gt演算子を使用して、 price.usdが200より大きい製品を見つけます。
db.inventory.aggregate( [   {     $match:       { $expr:         { $gt: [ { $getField: "price.usd" }, 200 ] }       }    } ] ) 
この操作は次の結果を返します。
[   { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },   { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 } ] 
ドル記号($ )で始まるクエリ フィールド
以下のドキュメントを持つinventoryコレクションを検討してください。
db.inventory.insertMany( [    { _id: 1, item: "sweatshirt", "$price": 45.99, qty: 300 },    { _id: 2, item: "winter coat", "$price": 499.99, qty: 200 },    { _id: 3, item: "sun dress", "$price": 199.99, qty: 250 },    { _id: 4, item: "leather boots", "$price": 249.99, qty: 300 },    { _id: 5, item: "bow tie", "$price": 9.99, qty: 180 } ] ) 
次の操作では、 $getField 、 $gt 、および$literal演算子を使用して、 $priceが200より大きい製品を見つけます。
db.inventory.aggregate( [   {     $match:       { $expr:         { $gt: [ { $getField: {$literal: "$price" } }, 200 ] }       }    } ] ) 
この操作は次の結果を返します。
[   { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },   { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 } ] 
サブ ドキュメントのフィールドに対するクエリ
次のドキュメントを使用して inventory コレクションを作成します。
db.inventory.insertMany( [    { _id: 1, item: "sweatshirt",  "price.usd": 45.99,      quantity: { "$large": 50, "$medium": 50, "$small": 25 }    },    { _id: 2, item: "winter coat", "price.usd": 499.99,      quantity: { "$large": 35, "$medium": 35, "$small": 35 }    },    { _id: 3, item: "sun dress", "price.usd": 199.99,      quantity: { "$large": 45, "$medium": 40, "$small": 5 }    },    { _id: 4, item: "leather boots", "price.usd": 249.99,      quantity: { "$large": 20, "$medium": 30, "$small": 40 }    },    { _id: 5, item: "bow tie", "price.usd": 9.99,      quantity: { "$large": 0, "$medium": 10, "$small": 75 }    } ] ) 
次の操作は、$small アイテムの数が 20 以下であるドキュメントを返します。
db.inventory.aggregate( [    { $match:       { $expr:          { $lte:             [                { $getField:                   { field: { $literal: "$small" },                     input: "$quantity"                   }                },                20             ]          }       }    } ] ) 
次の演算子を使用して、コレクションをクエリします。
- $lte演算子は、20 以下の値を検索します。
- $getFieldには明示的な- field- input- $smallパラメーターと パラメーターが必要です。 フィールドはサブドキュメントの一部であるためです。
- $getFieldは- $literalを使用して "- $small" を評価します。フィールド名にドル記号(- $)が含まれているためです。
出力例:
[   {     _id: 3,     item: 'sun dress',     'price.usd': 199.99,     quantity: { '$large': 45, '$medium': 40, '$small': 5 }   } ]