‫Instructor: Entonces, esta es la segunda
‫parte del cálculo de las estadísticas de revisión.
‫Esta vez, para cuando se actualiza o elimina una revisión.
‫Y esta parte es en realidad un
‫poco más difícil porque, tenga
‫en cuenta que una revisión se
‫actualiza o
‫elimina usando findByIdAndUpdate o también findByIdAndDelete, ¿verdad?
‫Entonces, para estos, en realidad no tenemos middleware de documentos,
‫sino solo middleware de consultas, de acuerdo.
‫Entonces, en la consulta, en realidad no
‫tenemos acceso directo al documento para luego hacer algo
‫similar a esto, está bien.
‫Porque, recuerde, necesitamos acceso a la revisión actual, de
‫modo que desde allí, podamos extraer el ID
‫del recorrido y luego calcular las estadísticas desde allí, correcto, pero nuevamente,
‫para estos ganchos aquí, solo
‫tenemos el middleware de consultas, está bien.
‫Pero déjame mostrarte un
‫buen truco para sortear esta limitación.
‫Entonces, vamos a implementar
‫un pre-middleware para estos ganchos, básicamente para estos eventos.
‫Entonces, antes, y luego de nuevo, voy a usar una
‫expresión regular para una cadena que comienza con
‫findOneAnd y eso es todo.
‫Y entonces este
‫va a funcionar para findOneAndUpdate y findOneAndDelete
‫porque, recuerde que detrás
‫de escena, findByIdAndUpdate es solo una
‫abreviatura de findOneAndUpdate con la ID actual, correcto.
‫Entonces, aquí, realmente necesitamos usar los
‫ganchos de middleware findOneAndDelete y findOneAndUpdate, de acuerdo.
‫Entonces, funciona y obtiene la siguiente palabra clave
‫porque es pre-middleware.
‫Entonces, recuerde que el objetivo es obtener acceso
‫al documento de revisión actual, está bien,
‫pero aquí, esta palabra clave es la consulta actual.
‫Ahora bien, ¿cómo vamos a solucionar esto?
‫Bueno, básicamente podemos ejecutar una consulta, y luego
‫eso nos dará el documento que
‫se está procesando actualmente.
‫Entonces, para hacer eso, podemos usar findOne.
‫Y eso es.
‫Entonces, todo lo que tenemos que hacer es esperar esta consulta y
‫luego guardarla en algún lugar.
‫Así que llamémoslo r, que va a ser objeto de revisión, de acuerdo.
‫Luego guárdelo como async.
‫Y eso es.
‫Y solo para asegurarnos de que
‫esto funcione aquí, por ahora registremos esto en la consola, de acuerdo.
‫Entonces, sin hacer ningún cálculo, lo único
‫que realmente nos
‫interesa es ver si este buen truco funciona.
‫Básicamente, el truco de solucionar eso en un
‫midddleware de consulta es que
‫solo tenemos acceso a la consulta.
‫Entonces, nuevamente, necesitamos obtener acceso al
‫documento, por lo que básicamente ejecutamos esta consulta
‫usando findOne.
‫De acuerdo, actualice una revisión y, de hecho, actualice
‫la última que hicimos, de acuerdo, y
‫la calificación,
‫ahora configurémosla en cuatro.
‫Así que antes eran
‫cinco y ahora lo vamos a cambiar a cuatro.
‫Entonces
‫envió eso, y aquí está la reseña.
‫Ahora, por supuesto, la calificación todavía está
‫establecida en cinco en este punto, porque este findOne
‫aquí realmente obtiene el documento de la base
‫de datos, por lo que en este momento, en
‫pre, todavía no persistió ningún cambio en la base de
‫datos, y entonces eran
‫cinco antes, y ahora todavía serán cinco.
‫Pero eso realmente no
‫importa aquí porque todo lo que nos interesa es esta identificación.
‫En realidad, esta identificación de la gira, es
‫cierto, porque eso es lo
‫que vamos a necesitar para calcular las calificaciones promedio.
‫Bien, y ahora, usemos esa función.
‫Bien, ahora, pensemos en esto
‫porque si usáramos esta función calcAverageRatings en este
‫momento, entonces
‫calcularíamos las estadísticas usando
‫los datos no actualizados, de acuerdo.
‫Y esa es exactamente la misma razón por la
‫que aquí arriba, también necesitábamos usar post y no pre,
‫está bien, porque solo después de que el documento ya
‫está guardado en la base
‫de datos, tiene sentido calcular las calificaciones.
‫Y aquí, es exactamente lo mismo, con
‫la gran diferencia de que no podemos simplemente cambiar
‫este pre a post.
‫Entonces no podemos hacer eso porque en este momento
‫ya no tenemos acceso a la consulta porque
‫la consulta ya se ha ejecutado, correcto, y sin
‫la consulta,
‫no podemos guardar el documento de
‫revisión, y luego no podemos ejecutar esta función.
‫Entonces, esto es realmente confuso, lo entiendo, pero realmente decidí
‫crear esta conferencia de esta manera porque, bueno, en
‫realidad es la única
‫solución para este problema, y es un gran
‫ejercicio para que usted comprenda básicamente esta Experiencia Hello.
‫Entonces, la solución para esto ahora es usar
‫post, entonces, reviewSchema, luego básicamente lo mismo,
‫así que, de hecho, copiemos todo esto, hagamos nuestras
‫vidas un poco más fáciles, eliminemos esto
‫y eliminemos el Siguiente.
‫Aquí, también necesitamos llamar a
‫continuación, está bien, pero luego lo publicamos, está bien.
‫Y ahora en este
‫momento, después de que la consulta ya haya
‫finalizado y, por lo tanto, la revisión se haya actualizado,
‫este es un momento perfecto en
‫el que podemos llamar a esta función.
‫Entonces, calcule las calificaciones promedio.
‫Pero, ¿de dónde obtenemos ahora la identificación de la gira?
‫Bueno, tendremos que usar un
‫truco que consiste básicamente en pasar datos del middleware
‫previo al middleware posterior.
‫Entonces, en lugar de guardar este documento en una variable
‫simple, lo guardaremos en esta. r.
‫Básicamente, creamos una propiedad en esta variable.
‫Bien, y ahora aquí, todavía tenemos acceso a eso.
‫Y ahora, podemos decir esto. r, que recuerda es la revisión,
‫y luego. excursión.
‫Entonces, esto es de nuevo bastante confuso, pero nuevamente
‫también bastante divertido una vez que entiendes cómo
‫funciona realmente, de acuerdo.
‫Ahora, nuevamente, necesitamos algo como esto aquí para realmente
‫llamar a esta función aquí porque recuerde que
‫este de hecho es
‫un método estático, por lo que debemos llamarlo en el modelo.
‫Ahora, ¿dónde está este modelo en este caso?
‫Bueno, es en esto. r, que en este caso
‫es equivalente a
‫esto aquí en este middleware. constructor. calcAverageRatings.
‫Woo, eso parece bastante abrumador, ¿no?
‫Por supuesto, tenemos que esperarlo, por eso lo declaramos
‫asíncrono, de acuerdo.
‫Entonces, nuevamente, básicamente usamos esta forma aquí de pasar los
‫datos del middleware previo al middleware posterior, y
‫entonces aquí recuperamos el
‫documento de revisión de esta variable.
‫De acuerdo, y nuevamente, tuvimos que hacerlo de esta manera
‫porque en este momento aquí, la consulta ya estaba ejecutada, por
‫lo que
‫no pudimos hacer esto aquí.
‫Y de hecho escribamos eso;
‫NO funciona aquí, la consulta ya se ha ejecutado.
‫Genial, y con esto, ahora deberíamos
‫estar listos para probar esto.
‫Así que sigamos adelante y actualice este
‫aquí una vez más, y configurémoslo en una calificación de uno, de acuerdo.
‫Ahora echemos un vistazo aquí, hasta que vea que el número de calificaciones
‫sigue siendo cinco, pero el
‫promedio ahora es solo tres, y ahora la pregunta
‫es si esto realmente se actualizó también
‫en el recorrido, y, sí, de hecho,
‫lo hizo. .
‫Entonces, cinco calificaciones con un promedio de tres.
‫Genial, ahora actualicemos otro.
‫Entonces, para eso, obtengamos todas nuestras reseñas, y
‫en realidad no las queremos todas,
‫sino solo la última.
‫Y aquí todavía tengo
‫este filtro, así que debería deshacerme de
‫eso, para que
‫obtengamos los 65 resultados, todas estas revisiones, pero solo queremos las últimas, es
‫decir, las que acabamos de crear.
‫Actualicemos ...
‫No estoy seguro, porque en realidad no están en orden aquí.
‫Vamos, está bien, aquí tenemos los más recientes.
‫Permítanme actualizar este aquí, digamos, cuatro, solo como una
‫prueba final, y eso debería elevar
‫un poco el promedio.
‫Y de hecho lo hizo.
‫Entonces, 3. 6 ahora, y por supuesto, el número
‫sigue siendo cinco porque no agregó una nueva reseña.
‫Así que funciona muy bien en la actualización,
‫ahora probémoslo también con la eliminación.
‫Así que sigamos adelante y eliminemos
‫la revisión que acabamos de actualizar y ahora deberíamos quedarnos
‫a solo cuatro, y de hecho, aquí estamos.
‫Así que ahora, solo cuatro.
‫Y eliminémoslos todos.
‫Entonces, este es el siguiente.
‫Ah, aquí estamos.
‫Entonces también este.
‫Entonces, ahora deberíamos
‫quedarnos solo a tres o, en
‫realidad, solo nos quedan dos con un promedio de cuatro.
‫Así que veamos cuál nos queda todavía.
‫Entonces es este con tres y este con cinco.
‫Y por eso tenemos este promedio de cuatro.
‫Así que vamos a deshacernos de este y ahora nuestro
‫promedio debería ser de cinco, ¿verdad?
‫O en realidad tres porque el único que queda
‫tiene tres.
‫Y ahora la prueba final, eliminando la
‫última, solo para ver qué pasará una vez que hagamos eso.
‫Y obtenemos un error aquí.
‫Por lo tanto, no se puede leer la propiedad nRating de undefined.
‫Eso es calcAverageRatings en la línea número 69.
‫Entonces, no sé qué es esto.
‫Entonces, línea 69, y entonces, es este problema aquí.
‫Entonces estamos tratando de leer nRating de undefined.
‫Entonces, las estadísticas cero son básicamente indefinidas.
‫Y eso es porque si no hay ningún
‫documento que coincida con esta consulta aquí básicamente,
‫entonces simplemente obtenemos una matriz vacía.
‫Y eso es exactamente lo que tenemos aquí.
‫Así que esta es la matriz de estadísticas y ahora
‫mismo no tiene ningún resultado, está bien,
‫por lo que solo deberíamos ejecutar este fragmento de código aquí
‫siempre que tengamos algo en la matriz de estadísticas.
‫Así que hagámoslo.
‫Entonces, si stats. la longitud es
‫mayor que cero, bueno, entonces haz esto.
‫Y si no, bueno, básicamente eso significa que
‫todas nuestras revisiones se han ido, bueno, entonces básicamente
‫queremos volver a los valores predeterminados.
‫Entonces, lo estableceremos en la cantidad
‫de cero y el promedio de 4. 5, que recuerde, es el predeterminado cuando no hay
‫revisiones en absoluto.
‫Así que creemos rápidamente una nueva revisión, y puede
‫ser esta, de acuerdo, así que volvemos
‫a tener
‫una calificación y ahora la eliminemos de inmediato, solo para probar
‫ese fragmento de
‫código que acabamos de escribir, solo para verlo aquí. también, por lo
‫que una calificación, promedio de cinco.
‫Y ahora, cuando lo eliminamos,
‫ya no obtenemos ningún error.
‫Y en nuestro recorrido, volvemos
‫a cero y un valor predeterminado de 4. 5.
‫Está bien, está bien, está bien, perfecto.
‫Así que, de nuevo, tomemos un breve
‫segundo para recapitular lo que acabamos de hacer.
‫Entonces, para poder ejecutar esta función
‫aquí también en la actualización y en la eliminación,
‫en realidad necesitamos usar el middleware de consultas
‫que nos brinda Mongoose para estas situaciones.
‫Bien, entonces, no tenemos un middleware
‫de documentos útil, que funcione, para estas funciones, sino que
‫necesitamos usar el
‫middleware de consultas, y en ese,
‫no tenemos acceso directo al documento actual.
‫Y entonces tenemos que
‫solucionar eso usando este findOne aquí,
‫y así básicamente recuperar el documento actual de la base de datos.
‫Luego lo almacenamos en la variable de
‫consulta actual, y eso es esto, y al hacer eso, obtenemos
‫acceso a él en el middleware de publicación.
‫Y es solo en el middleware de publicación donde realmente
‫calculamos las estadísticas para las revisiones.
‫Y recuerde que lo hacemos de esta manera porque si lo
‫hiciéramos bien en esta
‫función de middleware, entonces los datos subyacentes no
‫se habrían actualizado en ese punto y, por
‫lo tanto, las estadísticas calculadas no estarían realmente actualizadas.
‫Y es por eso que usamos este proceso
‫de dos pasos aquí básicamente.
‫Ahora, deshagámonos de esta consola. inicie sesión aquí, ya que hemos terminado, y también
‫de estas estadísticas.
‫Entonces, espero que esto haya sido divertido para
‫ti y no demasiado abrumador.
‫Diseñé este ejercicio específicamente para que pudiéramos
‫resolver un problema empresarial del mundo
‫real utilizando todas las herramientas que nos brinda Mongoose.
‫Y así, con eso, espero que haya aprendido un
‫poco mejor cómo trabajar con todos estos
‫diferentes middlewares en diferentes situaciones cuando sea necesario
‫en una situación del mundo real.
‫Entonces, un gran trabajo por terminar esta
‫conferencia bastante desafiante y por estar todavía conmigo en este punto del curso.
‫Es muy bueno para mí verlo, así que estoy
‫muy feliz por eso.
‫Pero de todos modos, todavía hay más contenido
‫excelente en esta sección, así que sigamos adelante juntos,
‫directamente al siguiente video.