No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Base de Datos NoSQL

Curso de Base de Datos NoSQL

Adán Figueroa Jiménez

Adán Figueroa Jiménez

Consultas Avanzadas con el Aggregation Framework de MongoDB

8/17
Recursos

MongoDB ofrece un framework de agregación poderoso y flexible, conocido como aggregation framework, que permite realizar consultas complejas mediante la combinación de diferentes etapas en pipelines.

¿Qué es el aggregation framework?

El aggregation framework de MongoDB permite realizar operaciones avanzadas en los datos utilizando una serie de etapas en una tubería, conocida como pipeline. Cada etapa procesa los datos y los pasa a la siguiente, similar a cómo el agua fluye a través de una tubería con válvulas que se abren y cierran.

¿Cómo se configura una etapa de agregación?

  1. Iniciar Aggregation en MongoDB Compass:

    • Abre MongoDB Compass y selecciona “Aggregations”.
    • Verás un resumen de documentos sin ninguna consulta aplicada.
  2. Agregar una etapa Match:

    • Selecciona “Match” como la primera etapa para filtrar documentos, similar a la operación find.
    • La eficiencia mejora al filtrar grandes cantidades de documentos primero.
  3. Ejecutar una consulta Match:

    • Copia una query existente y pégala en la etapa de match.
    • Los resultados se mostrarán automáticamente a la derecha.

¿Cómo se utilizan otras etapas en el pipeline?

  1. Agregar una etapa Project:

    • Selecciona “Project” para mostrar solo ciertos campos como title y release.
    • La salida de esta etapa se convierte en la entrada de la siguiente.
  2. Insertar una etapa Group:

    • Selecciona “Group” para agrupar documentos, similar a Group By en SQL.
    • Por ejemplo, agrupa por año y calcula el promedio de la duración de las películas (runtime).
  3. Ordenar los resultados:

    • Añade una etapa “Sort” para ordenar los resultados por el campo calculado, como el promedio de duración (average).

¿Cómo se manejan las etapas en el pipeline?

  • Las etapas se pueden reordenar y modificar según sea necesario.
  • Cada cambio en una etapa afecta la entrada de las siguientes etapas.
  • Es posible eliminar y añadir nuevas etapas para ajustar el flujo de datos.

¿Cómo exportar y editar el pipeline?

  • MongoDB Compass permite exportar el pipeline a diferentes lenguajes de programación.
  • Puedes editar el pipeline como texto para modificarlo de manera más sencilla.

¿Qué retos existen al usar el aggregation framework?

  • Explorar las diferentes etapas disponibles en el aggregation framework.
  • Realizar operaciones como Joins para combinar colecciones, por ejemplo, unir comentarios a películas utilizando el identificador de película en la colección Comments.

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

el join se realiza en realidad mediante el comando Lookup
Dejo un ejemplo de lookup como guía. ```js use("sample_mflix") db.movies.aggregate([ {$lookup:{ from:"comments", localField:"_id", foreignField:"movie_id", as: "Comments_info" }}, {$match: {released:{$gte:ISODate('2000-01-01')},Comments_info:{$exists: true,$not: {$size: 0}}}}, //find {$project: {title:1,released:1,year:1,runtime:1, Comments_info:1}}, {$limit: 5} ]) ``` {$lookup:{ ... }}: Especifica el operador $lookup para realizar el join. from:"comments": Indica que se realizará el join con la colección "comments". localField:"\_id": Especifica el campo en la colección "movies" que se utilizará para hacer la comparación. foreignField:"movie\_id": Especifica el campo en la colección "comments" que se utilizará para hacer el JOIN. as: "Comments\_info": El alias que le doy al nuevo conjunto de datos.
```js [ { $project: { _id: 1, title: 1, year: 1, type: 1, directors: 1, awards: 1, num_mflix_comments: 1 } }, { $lookup: { from: "comments", localField: "_id", foreignField: "movie_id", as: "comentarios" } }, { $sort: { num_mflix_comments: -1 } } ] ```
Mi reto completado :) ![](https://static.platzi.com/media/user_upload/image-b19b78a2-1e5c-49f2-9bf9-4a865af1da87.jpg)![](https://static.platzi.com/media/user_upload/image-bdfbaf72-57df-4e17-8760-7783c981d647.jpg)
✅ **Mi solución:** ```js [ { $project: { title: 1, num_mflix_comments: 1, } }, { $lookup: { from: "comments", localField: "_id", foreignField: "movie_id", as: "result" } }, { $sort: { num_mflix_comments: -1 } } ] ```
Adjunto mi solucion: `[` ` {` ` $match:` ` {` ` type: "movie",` ` released: {` ` $gte: ISODate(` ` "2000-01-01T00:00:00.000Z"` ` )` ` }` ` }` ` },` ` {` ` $project:` ` {` ` _id: 1,` ` title: 1,` ` fullplot: 1,` ` released: 1` ` }` ` },` ` {` ` $lookup:` ` {` ` from: "comments",` ` localField: "_id",` ` foreignField: "movie_id",` ` as: "movie_comments"` ` }` ` }` `]`