Usar Expresiones de ruta de campo para acceder a los campos en los documentos de entrada. Anteponer al nombre del campo o a la ruta de campo con puntos (para documentos incrustados) un signo de dólar
$.
Campos anidados
Los siguientes ejemplos utilizan el colección de planetas de las Bases de datos de ejemplo de Atlas. Cada documento en esta colección tiene la siguiente estructura:
{ _id: new ObjectId("6220f6b78a733c51b416c80e"), name: "Uranus", orderFromSun: 7, hasRings: true, mainAtmosphere: [ "H2", "He", "CH4" ], surfaceTemperatureC: { min: null, max: null, mean: -197.2 } }
Para especificar el campo mean anidado dentro de surfaceTemperatureC, use la notación por puntos ("field.nestedField") con un signo de dólar $. Esta canalización de agregación proyecta solo el valor del campo anidado mean para cada documento:
db.planets.aggregate( [ { $project: { nested_field: "$surfaceTemperatureC.mean" } } ] )
Un ejemplo de documento devuelto:
{ _id: ObjectId('6220f6b78a733c51b416c80e'), nested_field: -197.2 }
Arreglo de campos anidados
Utiliza la notación de puntos en la ruta de campo para acceder a un campo anidado dentro de un arreglo. Por ejemplo, considere una colección products cuyo campo instock contenga un arreglo de campos anidados warehouse:
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" } ] } ] )
La siguiente canalización de agregación utiliza $instock.warehouse para acceder a los campos warehouse anidados.
db.products.aggregate( [ { $project: { item: 1, warehouses: "$instock.warehouse" } } ] )
En este ejemplo, $instock.warehouse genera un arreglo de valores que están en el campo warehouse anidado para cada documento. El pipeline devuelve los siguientes documentos:
[ { _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" ] } ]
Arreglo de Arreglos Anidados
También puede usar la notación de puntos con un signo de dólar $ en una ruta de campo para acceder a un arreglo dentro de un arreglo anidado. El siguiente ejemplo utiliza una colección fruits con este documento:
db.fruits.insertOne( { _id: ObjectId("5ba53172ce6fa2fcfc58e0ac"), inventory: [ { apples: [ "macintosh", "golden delicious", ] }, { oranges: [ "mandarin", ] }, { apples: [ "braeburn", "honeycrisp", ] } ] } )
El siguiente pipeline de agregación accede a los arreglos anidados apples dentro de inventory:
db.fruits.aggregate( [ { $project: { all_apples: "$inventory.apples" } } ] )
En este pipeline, $inventory.apples se resuelve en un arreglo de matrices anidadas. El pipeline devuelve el siguiente documento:
{ _id: ObjectId('5ba53172ce6fa2fcfc58e0ac'), all_apples: [ [ "macintosh", "golden delicious" ], [ "braeburn", "honeycrisp" ] ] }
Obtén más información
Para obtener más información sobre cómo acceder e interactuar con elementos anidados, consulta Notación de Puntos y Consulta de un arreglo de documentos incrustados.