$getField (aggregation)
Definition
$getFieldNew in version 5.0.
Returns the value of a specified field from a document. If you don't specify an object,
$getFieldreturns the value of the field from$$CURRENT.You can use
$getFieldto retrieve the value of fields with names that contain periods (.) or start with dollar signs ($).Tip
Use
$setFieldto add or update fields with names that contain dollar signs ($) or periods (.).
Syntax
$getField has the following syntax:
{   $getField: {     field: <String>,     input: <Object>   } } 
Field  | Type  | Description  | 
|---|---|---|
  | String  | Field in the  If   | 
  | Object  | Default:  A valid expression that
contains the   | 
$getField has the following shorthand syntax for
retrieving field values from $$CURRENT:
{   $getField: <String> } 
For this syntax, the argument is equivalent to the value of field
described above.
Behavior
If
fieldresolves to anything other than a string constant,$getFieldreturns an error.If the
fieldthat you specify is not present in theinputobject, or in$$CURRENTif you don't specify aninputobject,$getFieldreturnsmissing.If
inputevaluates tomissing,undefined, ornull,$getFieldreturnsnull.If
inputevaluates to anything other than an object,missing,undefined, ornull,$getFieldreturns an error.$getFielddoesn't implicitly traverse objects or arrays. For example,$getFieldevaluates afieldvalue ofa.b.cas a top-level fielda.b.cinstead of a nested field{ a: { b: { c: } } }.
See also:
Examples
Query Fields that Contain Periods (.)
Consider an inventory collection with the following documents:
{ "_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 } 
The following operation uses the $getField and
$gt operators to find which products have a price.usd
greater than 200:
db.inventory.aggregate( [   {     $match:       { $expr:         { $gt: [ { $getField: "price.usd" }, 200 ] }       }    } ] ) 
The operation returns the following results:
[   { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },   { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 } ] 
Query Fields that Start with a Dollar Sign ($)
Consider an inventory collection with the following documents:
{ "_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 } 
The following operation uses the $getField,
$gt, and $literal operators to find which
products have a $price greater than 200:
db.inventory.aggregate( [   {     $match:       { $expr:         { $gt: [ { $getField: {$literal: "$price" } }, 200 ] }       }    } ] ) 
The operation returns the following results:
[   { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },   { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 } ] 
Query a Field in a Sub-document
Create an inventory collection with the following documents:
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 }    } ] ) 
The following operation returns documents where the number of
$small items is less than or equal to 20.
db.inventory.aggregate( [    { $match:       { $expr:          { $lte:             [                { $getField:                   { field: { $literal: "$small" },                     input: "$quantity"                   }                },                20             ]          }       }    } ] ) 
Use these operators to query the collection:
The
$lteoperator finds values less than or equal to 20.$getFieldrequires explicitfieldandinputparameters because the$smallfield is part of a sub-document.$getFielduses$literalto evaluate "$small", because the field name has a dollar sign ($) in it.
Example output:
[   {     _id: 3,     item: 'sun dress',     'price.usd': 199.99,     quantity: { '$large': 45, '$medium': 40, '$small': 5 }   } ]