You can use field path expressions to access
fields in input documents. To specify a field path, prefix the field
name or the dotted field path (if the
field is in an embedded document) with a dollar sign $
.
Use Cases
You can use field paths for the following use cases:
Nested Fields
The following example uses the planets collection from the Atlas Sample Databases. Each document in this collection has the following structure:
{
_id: new ObjectId("6220f6b78a733c51b416c80e"),
name: "Uranus",
orderFromSun: 7,
hasRings: true,
mainAtmosphere: [ "H2", "He", "CH4" ],
surfaceTemperatureC: { min: null, max: null, mean: -197.2 }
}
To specify the nested field mean
within the surfaceTemperatureC
field, use dot notation ("field.nestedField"
) with a dollar
sign $
. The following aggregation pipeline projects only the
mean
nested field value for each document:
db.planets.aggregate( [
{
$project: {
nested_field: "$surfaceTemperatureC.mean"
}
}
] )
Below is an example returned document:
{ _id: ObjectId('6220f6b78a733c51b416c80e'), nested_field: -197.2 }
Array of Nested Fields
You can use dot notation in a field path to access a field that is nested within an array.
For example, consider a products
collection that contains an
instock
field. The instock
field contains an array of nested
warehouse
fields.
db.products.insertMany( [
{ item: "journal", instock: [ { warehouse: "A"}, { warehouse: "C" } ] },
{ item: "notebook", instock: [ { warehouse: "C" } ] },
{ item: "paper", instock: [ { warehouse: "A" }, { warehouse: "B" } ] },
{ item: "planner", instock: [ { warehouse: "A" }, { warehouse: "B" } ] },
{ item: "postcard", instock: [ { warehouse: "B" }, { warehouse: "C" } ] }
] )
The following aggregation pipeline uses $instock.warehouse
to access
the nested warehouse
fields.
db.products.aggregate( [
{
$project: {
item: 1,
warehouses: "$instock.warehouse"
}
}
] )
In this example, $instock.warehouse
outputs an array of values that
are in the nested warehouse
field for each document. The pipeline
returns the following documents:
[
{
_id: ObjectId('6740b55e33b29cf6b1d884f7'),
item: "journal",
warehouses: [ "A", "C" ]
},
{
_id: ObjectId('6740b55e33b29cf6b1d884f8'),
item: "notebook",
warehouses: [ "C" ]
},
{
_id: ObjectId('6740b55e33b29cf6b1d884f9'),
item: "paper",
warehouses: [ "A", "B" ]
},
{
_id: ObjectId('6740b55e33b29cf6b1d884fa'),
item: "planner",
warehouses: [ "A", "B" ]
},
{
_id: ObjectId('6740b55e33b29cf6b1d884fb'),
item: "postcard",
warehouses: [ "B", "C" ]
}
]
Array of Nested Arrays
You can also use dot notation with a dollar sign $
in a
field path to access an array within a nested array.
This example uses a fruits
collection that contains the
following document:
db.fruits.insertOne(
{
_id: ObjectId("5ba53172ce6fa2fcfc58e0ac"),
inventory: [
{
apples: [
"macintosh",
"golden delicious",
]
},
{
oranges: [
"mandarin",
]
},
{
apples: [
"braeburn",
"honeycrisp",
]
}
]
}
)
The document in the collection contains an inventory
array where
each element in the array is an object that contains a nested array
field.
Consider the following aggregation pipeline:
db.fruits.aggregate( [
{ $project:
{ all_apples: "$inventory.apples" } }
] )
In this pipeline, $inventory.apples
resolves to an array of nested
arrays. The pipeline returns the following document:
{
_id: ObjectId('5ba53172ce6fa2fcfc58e0ac'),
all_apples: [
[ "macintosh", "golden delicious" ],
[ "braeburn", "honeycrisp" ]
]
}
Learn More
For more information on accessing and interacting with nested elements, see Dot Notation and Query an Array of Embedded Documents.