‫Narrador: Bienvenido de nuevo.
‫En este video y en
‫el siguiente, quiero presentarles la
‫canalización de agregación de MongoDB, que es un marco de
‫MongoDB extremadamente poderoso y extremadamente útil para la
‫agregación de datos.
‫Y la idea
‫es que básicamente definamos un pipeline por
‫el que pasan todos los
‫documentos de una determinada colección donde
‫se procesan paso a paso para transformarlos en resultados agregados.
‫Por ejemplo, podemos usar la tubería de
‫agregación para calcular promedios o calcular
‫valores mínimos y máximos o podemos calcular
‫distancias incluso, y realmente podemos hacer
‫todo tipo de cosas.
‫Es realmente sorprendente lo poderosa que
‫es esta canalización de agregación.
‫Está bien, pero basta de hablar.
‫Comencemos ahora a usar la canalización de agregación y
‫crearé una nueva función de encabezado aquí porque
‫más adelante definiremos una nueva ruta y luego
‫usaremos esa función para eso.
‫Pero esa nueva ruta, la crearé más tarde.
‫Así que quiero crear una
‫función aquí que calculará un par de estadísticas sobre nuestros recorridos.
‫Así que voy a llamar a este getTourStats.
‫Bien, entonces Estadísticas para estadísticas, y
‫será una función asíncrona,
‫por lo que un código vs ahora se rellena automáticamente con esto.
‫Muy bien, creemos o intentemos atrapar el bloque aquí.
‫De hecho, voy a copiar esto de
‫aquí arriba, y ahora aquí crearé una
‫variable llamada stats.
‫Ahora, la canalización de agregación es realmente una característica de MongoDB.
‫Pero Mongoose, por supuesto, nos da acceso
‫a él, para que podamos usarlo en el controlador de Mongoose, ¿verdad?
‫Entonces, usando nuestro modelo de recorrido
‫para acceder a la colección de recorridos,
‫decimos recorrido. agregar.
‫Entonces, la canalización de agregación es un
‫poco como una consulta normal y, por lo tanto, usar la
‫canalización de agregación es un poco como hacer una consulta regular.
‫La diferencia aquí es que en agregaciones, como
‫ya mencioné, podemos manipular los datos en un
‫par de pasos diferentes,
‫por lo que ahora definamos estos pasos.
‫Y para eso, pasamos por una serie de las llamadas etapas.
‫Entonces pasamos en una matriz, y luego
‫aquí tendremos muchas etapas.
‫Y nuevamente, los documentos pasan por estas etapas una
‫por una, paso a paso en la secuencia de definición
‫como la definimos aquí.
‫Entonces, cada uno de los elementos de esta
‫matriz será una de las etapas.
‫Y hay un montón de etapas diferentes entre
‫las que podemos elegir, pero solo les diré
‫las más comunes en esta conferencia
‫y también en la siguiente.
‫Pero de todos modos, ahora quiero tomarme
‫un minuto y echar un vistazo rápido a la documentación de
‫MongoDB porque creo que aún no lo hicimos.
‫Entonces MongoDB y ya conocemos este sitio web.
‫Entonces, en nuestro sitio web de MongoDB, vamos aquí
‫para aprender, luego la documentación y luego
‫aquí seleccionamos el Manual de MongoDB y esta documentación es enorme.
‫Realmente, tiene muchas cosas aquí y si
‫fueras a pasar por todo,
‫bueno, entonces te convertirías realmente en un maestro de MongoDB.
‫Así que te da una buena introducción a MongoDB,
‫tienes la instalación aquí.
‫Tienes las operaciones CRUD, así que una buena descripción
‫general de muchas
‫de las cosas que ya aprendimos antes, ¿verdad?
‫Luego tienes cosas sobre la agregación y,
‫en particular, la tubería de agregación de la
‫que vamos a hablar ahora,
‫pero lo que realmente quiero mostrarte aquí
‫es en realidad esta referencia que tenemos en la parte inferior
‫porque en la referencia que tenemos aquí para
‫ejemplo, los operadores y ahí es
‫donde tenemos muchas cosas importantes que hemos estado usando todo el tiempo.
‫Entonces, echemos un vistazo aquí
‫a los operadores de consulta, por ejemplo, y aquí puede ver, en
‫realidad tenemos estos operadores que ya usamos.
‫Entonces por ejemplo, mayor o igual, o menor
‫que e igual, pero si algún
‫día en tus propias aplicaciones necesitas algún
‫otro operador, bueno, ahora ya sabes dónde puedes encontrarlos.
‫Ahora, por supuesto, también siempre es
‫muy útil hacer una búsqueda rápida en Google,
‫probablemente encuentre alguna publicación de desbordamiento de pila al
‫respecto, pero créanme, muchas veces
‫es más fácil y rápido saltar rápidamente a la documentación y buscar
‫rápidamente lo que sea que ' estás necesitando.
‫Solo necesita saber cómo funciona la documentación
‫y una vez que lo sepa, será bastante
‫fácil para usted encontrar lo que está buscando, ¿de acuerdo?
‫Aquí también tiene algunos operadores
‫lógicos, por ejemplo, el operador OR que ya usamos.
‫Una vez más, realmente un montón de cosas, operadores geoespaciales y, de
‫hecho, usaremos algunos más tarde, y
‫sí, realmente muchas cosas.
‫Entonces, lo que quería mostrarles después de esta conferencia, en realidad,
‫son las etapas del proceso de agregación.
‫Así que aquí tienes muchos de
‫ellos y lo que vamos a usar en
‫esta conferencia aquí es coincidencia, por ejemplo y grupo,
‫¿dónde es eso?
‫Sí, grupo, ese es uno muy importante, y
‫como mencioné, les mostraré los
‫más importantes en esta conferencia y en la próxima.
‫Pero de nuevo, si en algún caso necesita algo
‫más, continúe, venga aquí a esta documentación
‫y encontrará lo que está buscando.
‫¿Está bien?
‫De todos modos, aprendamos ahora cómo podemos definir realmente
‫una de estas etapas, ¿de acuerdo?
‫Y voy a empezar con un partido.
‫Y emparejar consiste básicamente
‫en seleccionar o filtrar determinados documentos.
‫Y entonces es muy simple.
‫Es realmente como un objeto de filtro en MongoDB,
‫como lo hemos estado usando tantas veces.
‫Entonces, cada una de las etapas es un
‫objeto y luego aquí viene el nombre de la etapa.
‫Entonces esta es la etapa del partido, ¿de acuerdo?
‫Y como mencioné, en realidad es solo una consulta.
‫Entonces, digamos que para empezar, solo queremos seleccionar documentos
‫que tengan un promedio
‫de calificaciones mayor o igual a 4. 5.
‫Entonces, ¿puedes hacer eso?
‫Solo te daré un segundo para que lo hagas aquí.
‫Así que espero que lo hayas hecho.
‫Por lo tanto, las calificaciones promedio deben ser mayores
‫o iguales que 4. 5.
‫Y eso es todo, esa es la primera etapa.
‫Y, por lo general, esta etapa del partido es solo una etapa preliminar
‫para luego prepararse para las siguientes etapas que se avecinan.
‫Así que la siguiente es ahora la fase de grupos.
‫Entonces, agrupe y
‫luego allí, siempre debemos pasar solo otro objeto.
‫Así que se ve un poco extraño con todos estos
‫objetos, pero sí, ya lo has visto antes y
‫MongoDB simplemente funciona de esta manera.
‫Siempre son objetos, dentro de objetos, dentro de objetos.
‫Y este grupo aquí es donde ocurre la
‫verdadera magia porque como
‫su nombre lo dice, nos permite
‫agrupar documentos, básicamente usando acumuladores.
‫Y un acumulador es,
‫por ejemplo, incluso calculando un promedio.
‫Entonces, si tenemos cinco recorridos, cada uno de ellos
‫tiene una calificación, podemos calcular la calificación promedio usando el grupo.
‫Y entonces hagamos exactamente eso aquí.
‫Ahora, lo primero es que siempre tenemos
‫que especificar la identificación porque aquí es donde vamos a especificar
‫por qué queremos agrupar.
‫Por ahora, decimos nulo aquí porque queremos
‫tener todo en un grupo para poder calcular las
‫estadísticas de todos los recorridos juntos y
‫no separarlos por grupos.
‫Un poco más tarde, también agruparemos por diferentes cosas, por ejemplo,
‫podemos agrupar por la dificultad y luego podemos,
‫por ejemplo, calcular el promedio para los recorridos
‫fáciles, el promedio para los recorridos medios y
‫el promedio para los recorridos difíciles.
‫Entonces, nuevamente, podemos agrupar por uno de nuestros campos
‫y ese campo, lo especificaremos aquí, pero por
‫ahora, como dije, queremos calcular estos promedios para todos
‫los recorridos juntos en un gran grupo.
‫Entonces, en ese caso, decimos _id y lo establecemos en nulo.
‫Ahora calculemos realmente la calificación promedio.
‫Para hacer eso, simplemente especificamos un
‫nuevo campo, así que llamémoslo simplemente calificación promedio,
‫así, y esto será bueno,
‫el promedio, que
‫es otro operador de MongoDB, así que este de aquí.
‫Lo encontrará en la referencia si lo busca.
‫Entonces, este es un operador matemático que
‫calcula el promedio y ahora el nombre del campo.
‫Y nuevamente, sé que esto se verá muy extraño,
‫pero para especificar el campo del cual queremos
‫calcular el promedio, necesitamos usar el signo
‫de dólar, pero entre comillas aquí y luego
‫el nombre del campo.
‫Entonces, las calificaciones promedian en este caso.
‫Y calculemos también el precio medio.
‫Entonces, el precio promedio, y nuevamente, lo hizo mal aquí, y
‫luego el
‫promedio y luego nuevamente, el nombre
‫del campo y entre comillas y con
‫este signo de dólar.
‫Bien, parece un poco extraño de nuevo,
‫pero esta es
‫solo la forma en que funciona la canalización de agregación.
‫Entonces tenemos el precio medio.
‫De hecho, calculemos también el precio mínimo,
‫es decir, el precio más pequeño y el precio más alto.
‫Así que
‫minPrice y de ahora en adelante, todo se verá similar,
‫así que ahora usamos el
‫operador min y luego nuevamente el nombre del campo como este.
‫Y una coma aquí y ahora simplemente dupliquemos
‫este para calcular el precio máximo.
‫Y ahora, echemos un vistazo a lo que
‫ya tenemos en este punto.
‫Así que ahora tenemos que enviar esta respuesta,
‫y de nuevo,
‫iré y tomaré algunas de estas respuestas ya hechas aquí.
‫Entonces, los datos que queremos enviar se llaman estadísticas.
‫Y ahora todo lo que tenemos que hacer es agregar una nueva
‫ruta aquí en nuestras rutas de viaje y nuevamente, voy a
‫editar aquí, justo en la parte superior.
‫Entonces enrutador. route
‫/ gettour, o simplemente tour-stats, así porque el get
‫ya está definido en el método HTTP.
‫Así que no es necesario repetirlo en el nombre.
‫Entonces tourController. getTourStats.
‫Dale una caja fuerte y probémoslo ahora.
‫Así que estoy realmente emocionado de probarlo ahora, de hecho
‫para ver si funciona porque nuevamente es una herramienta realmente asombrosa y
‫realmente poderosa que
‫te permite hacer muchas cosas.
‫Entonces, envíenos las estadísticas de
‫la gira y ese no es realmente
‫el resultado que estábamos esperando, así que esa es solo
‫la tubería que definimos, pero ya sé por qué.
‫Así que no esperamos el resultado.
‫Así que, básicamente, al igual
‫que una consulta normal, devolverá un objeto agregado.
‫Tan . find devolverá una consulta y. aggregate
‫devolverá un objeto agregado.
‫Y luego, solo cuando
‫lo esperamos, realmente regresa con el resultado.
‫Por eso también definimos esta función aquí como una
‫función asincrónica, para que luego podamos usar await allí
‫y este es el lugar correcto.
‫Vamos a intentarlo otra vez.
‫¡Y aquí vamos!
‫¡Que bien!
‫Tenemos la calificación promedio de todos nuestros tours, tenemos
‫el precio promedio
‫que ves es 1563 y luego el mínimo y el máximo, ¿verdad?
‫Y a partir de nuestros datos, podemos
‫confirmar que esto es cierto.
‫¡Que bien!
‫Realmente genial.
‫Ahora, una cosa más que
‫quiero hacer aquí es calcular el número
‫total de calificaciones que tenemos y también el número total de recorridos.
‫Así que
‫tenemos la calificación promedio
‫aquí y hagámoslo antes, así que numRatings,
‫así y probablemente puedas adivinar
‫que este se llama suma y luego ratingsAverage,
‫o en realidad no ratingsAverage, sino ratingsQuantity, ¿verdad?
‫Ahí es donde se almacena la cantidad de calificaciones
‫y, por lo tanto, la cantidad de calificaciones, el total,
‫será la suma de todas estas juntas.
‫Y ahora, el último es el número de
‫recorridos y ese es un
‫poco más complicado, por lo que es bueno mostrarles aquí.
‫Así que todavía queremos sumar, así que para sumar
‫todo, básicamente, todavía usamos la suma, pero ¿qué
‫vamos a sumar juntos?
‫Bueno, básicamente agregamos uno para cada documento, entonces
‫decimos 1, y eso es todo.
‫Básicamente, para cada documento
‫que pasará por esta canalización,
‫se agregará uno a este contador numérico.
‫Llamémoslo numTours.
‫Entonces, sí, probémoslo ahora, de nuevo.
‫Y de hecho tenemos nuestras nueve giras y
‫ya sabemos que tenemos nueve.
‫Así que estas son todas las estadísticas de todos los recorridos juntos, pero
‫ahora vayamos al siguiente nivel.
‫Como dije antes, ahora podemos agrupar nuestros resultados
‫para diferentes campos.
‫Y comencemos realmente con la dificultad.
‫Y eso es bastante similar a especificar los campos allí abajo,
‫que es simplemente el signo de dólar, y
‫luego el nombre del campo.
‫Entonces $ dificultad, dale una caja fuerte y eso es todo.
‫Envíalo aquí, y ahora tenemos las estadísticas
‫definidas para cada una de estas tres dificultades.
‫Eso es realmente asombroso.
‫Así que esta es la parte que me sorprende.
‫Es absolutamente fantástico.
‫Quiero decir, puedes empezar a ver todo tipo
‫de cosas, todos los tipos de
‫manipulación de datos que puedes hacer usando esta canalización, ¿verdad?
‫Entonces realmente podemos comenzar a analizar cosas,
‫por ejemplo, vemos que los recorridos más fáciles son
‫los que obtienen las calificaciones más bajas
‫con un 4. 6, mientras que los
‫tours medios son los que obtienen las calificaciones más altas.
‫También podemos ver que los
‫tours difíciles son los más caros con
‫un precio medio de 1997, mientras que los más fáciles también son
‫los más baratos con un precio de 1272, ¿no?
‫También vemos que los
‫recorridos más fáciles son los que
‫más tenemos, así que cuatro fáciles y solo dos difíciles, ¿verdad?
‫Entonces, podemos usar esto, por
‫supuesto, para obtener todo tipo de información sobre nuestros datos.
‫Comentemos
‫este aquí y probemos otro, por
‫ejemplo, por calificaciones, por qué
‫no, probemos, veamos qué obtenemos.
‫Entonces, por ejemplo, tenemos dos recorridos, así que básicamente con
‫una calificación de 4. 5, tenemos
‫dos recorridos con 4. 7, una gira con 4. 8, y
‫tres recorridos con 4. 9.
‫Ah, y también aquí abajo, una gira con 4. 6, y así,
‫por ejemplo, una idea que podemos
‫obtener aquí es que los tours muy caros con
‫este precio promedio de 1997 obtienen calificaciones extremadamente buenas.
‫Así que todo tipo de cosas, realmente las que podemos hacer aquí.
‫Deshagámonos de este, agreguemos este de nuevo, y ahora
‫podemos igualar,
‫hacer algunas operaciones con este.
‫Así que solo por diversión, pongamos esta dificultad en mayúsculas.
‫Así que esto, por supuesto, va a ser otro objeto aquí y
‫aquí al frente está el operador.
‫Y entonces el operador en este caso, se llama $ toUpper.
‫Entonces, otro operador de MongoDB.
‫Así que échale un vistazo, y ahora está escrito en mayúsculas.
‫¡Excelente!
‫Así que tenemos la fase de grupos aquí, que está bastante completa.
‫Así que probemos con otra que sea una especie de etapa.
‫Entonces, otro objeto en nuestra matriz para otra etapa más
‫y este se llama sort.
‫Así que ordena y luego, necesitamos otro objeto, y
‫este se completó automáticamente, no sé por qué,
‫y aquí ahora podemos especificar por
‫qué campo queremos ordenar esto y realmente usemos el precio promedio.
‫Y ahora aquí, en la clasificación, necesitamos usar los nombres
‫de campo que especificamos aquí en el grupo.
‫Ya no podemos usar los nombres antiguos porque en este punto
‫ya se han ido.
‫Ya no existen.
‫Entonces, en este punto, en la
‫tubería de agregación, realmente ya tenemos estos resultados.
‫Estos son ahora básicamente nuestros documentos.
‫Entonces, si desea ordenar por precio promedio, entonces este
‫es el nombre de campo que debemos usar.
‫Entonces podemos decir, el precio promedio
‫y luego podemos decir 1 para ascender.
‫Así que probemos eso.
‫Y sí, de hecho.
‫Ese es el más bajo y ese es el más alto.
‫¡Excelente!
‫Así que hicimos muchas cosas.
‫Permítanme mostrarles que también podemos repetir etapas.
‫Así que hagamos otra coincidencia
‫aquí y esta es
‫solo para mostrarles que en realidad
‫podemos repetir etapas y también quiero mostrarles otro operador.
‫Así que ahora seleccionemos por id y recordemos que id es
‫ahora la dificultad, ¿verdad?
‫Así que lo especificamos aquí.
‫Entonces queremos la identificación y ahora un nuevo operador
‫que aún no usamos.
‫Queremos que no sea igual, digamos fácil.
‫Y así, así, seleccionaremos
‫todos los documentos que no sean fáciles.
‫Entonces, en este caso,
‫el que dice medio y difícil, ¿verdad?
‫Entonces, básicamente, excluyendo el que dice fácil, ¿verdad?
‫Nuevamente, no es
‫realmente útil aquí porque eliminará muchos de nuestros datos significativos, pero
‫solo para mostrarle que, por supuesto,
‫podemos hacer coincidir varias veces.
‫Entonces, en este caso, emparejamos una vez antes de
‫hacer el grupo y luego emparejamos una vez que estábamos listos,
‫haciendo el agrupamiento.
‫Ahora, mantengamos esto aquí, fuera de
‫nuestra tubería de agregación, pero
‫lo dejaré aquí, solo para que
‫lo guardes como referencia.
‫Vuelva a guardarlo, inténtelo de nuevo, y estos son
‫nuestros resultados para obtener las
‫estadísticas de nuestro recorrido.
‫Muy bonito, realmente genial.
‫Espero que hayan disfrutado de
‫este video y en el siguiente,
‫seguiremos usando la canalización de agregación para hacer algunos cálculos más.
‫Y para mostrarte algunas etapas más diferentes.
‫Así que estad atentos a ese.