$getField (aggregation)
On this page
Definition
$getField
New in version 5.0.
Returns the value of a specified field from a document. If you don't specify an object,
$getField
returns the value of the field from$$CURRENT
.You can use
$getField
to retrieve the value of fields with names that contain periods (.
) or start with dollar signs ($
).Tip
Use
$setField
to 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 | Input object for which you want to return a value. Changed in version 7.2: 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 the
field
that you specify is not present in theinput
object, or in$$CURRENT
if you don't specify aninput
object,$getField
returnsmissing
.If
input
evaluates tomissing
,undefined
, ornull
,$getField
returnsnull
.If
input
evaluates to anything other than an object,missing
,undefined
, ornull
,$getField
returns an error.$getField
doesn't implicitly traverse objects or arrays. For example,$getField
evaluates afield
value ofa.b.c
as a top-level fielda.b.c
instead of a nested field{ a: { b: { c: } } }
.
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
$lte
operator finds values less than or equal to 20.$getField
requires explicitfield
andinput
parameters because the$small
field is part of a sub-document.$getField
uses$literal
to 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 } } ]