‫-: Bienvenido de nuevo al siguiente video.
‫Y sigamos adelante ahora con
‫una característica nueva y bastante avanzada de Mongoose
‫llamada 'Virtual Populate'. Entonces, en
‫ese momento, hemos llenado
‫las reseñas con
‫el recorrido y los datos del usuario aquí mismo, ¿verdad?
‫Entonces, ahora mismo,
‫cuando solicitamos reseñas, obtenemos acceso a esa información.
‫Sin embargo, eso todavía deja un problema sin resolver.
‫Entonces, ¿cómo vamos a acceder a las reseñas de los tours?
‫Básicamente, al revés.
‫Entonces, digamos que solicité un recorrido específico.
‫Y luego, ¿cómo tendré
‫acceso a todas las reseñas de ese tour?
‫Y este problema surge aquí porque
‫hicimos referencias a los padres en las revisiones.
‫Entonces, básicamente, tener las reseñas apuntando a los
‫tours y no los tours apuntando a las reseñas.
‫Y así, como dijimos al principio de la
‫sección, en este
‫caso, el padre realmente no conoce a sus hijos.
‫Y así, en
‫este ejemplo, el tour no conoce sus reseñas.
‫Y a veces, está bien.
‫Pero en este caso, queremos
‫que la gira conozca básicamente todas las críticas que tiene.
‫Ahora, para resolver esto, con
‫lo que sabemos
‫en este punto, podríamos tener dos soluciones.
‫Y el primero sería consultar manualmente
‫las reseñas cada vez que realizamos una consulta sobre recorridos.
‫Pero sería un
‫poco engorroso hacerlo manualmente de esta manera.
‫Y la segunda solución podría ser también hacer
‫referencias a niños en los recorridos.
‫Básicamente, mantenga una matriz de todas
‫las ID de revisión en cada documento de viaje.
‫Entonces, todo lo que
‫tendríamos que hacer es llenar esa matriz, ¿verdad?
‫Pero, en realidad, ya descartamos hacer esto
‫bien al principio porque
‫no queremos almacenar esa matriz de
‫ID de revisión que luego
‫podría crecer indefinidamente en nuestra base de datos, ¿verdad?
‫Y esa es exactamente la razón por la que
‫elegimos la referencia de padres en primer lugar.
‫Sin embargo, existe una gran solución para esto.
‫Y eso es porque Mongoose en realidad nos ofrece
‫una muy buena solución para este
‫problema con una característica bastante avanzada llamada 'Virtual Populate'. Entonces, con 'Virtual
‫Populate', podemos
‫completar el recorrido con reseñas.
‫Entonces, en otras
‫palabras, podemos tener acceso a todas las reseñas
‫de un recorrido determinado, pero sin mantener este conjunto de identificaciones en el recorrido.
‫Por lo tanto, piense
‫en 'Virtual Populate' como una forma de mantener ese conjunto de ID
‫de revisión en un recorrido, pero sin conservarlo en la base de datos.
‫Y entonces eso resuelve el problema
‫que tenemos con las referencias de niños, ¿verdad?
‫Entonces, es un poco como campos virtuales, pero con poblar, ¿de acuerdo?
‫Entonces, solo para ilustrar
‫eso, vayamos a nuestro modelo de gira aquí.
‫Entonces, lo que acabo de
‫describir sería, en teoría, hacer algo como esto.
‫Entonces, en nuestro modelo de
‫viaje, agregaríamos un campo llamado 'Reseñas'. '(teclas haciendo
‫clic) Y luego establezca el
‫tipo en Mongoose. Esquema. ObjectId.
‫(teclas haciendo clic) Y no es
‫necesario que escriba esto.
‫Solo lo hago para mostrártelo.
‫(teclas haciendo clic) Y luego
‫conéctelo con 'Revisar. Y, por supuesto,
‫esto de aquí tendría que ser un objeto.
‫Pero, lo que importa aquí es que
‫básicamente así es como implementaríamos la referencia a niños.
‫Entonces, las revisiones de referencia de la gira, ¿de acuerdo?
‫Pero de nuevo, no queremos hacerlo.
‫Entonces, en su lugar, implementaremos 'Virtual Populate. '(teclas haciendo
‫clic) Está bien.
‫Y funciona así.
‫Así que lo hacemos aquí en el esquema de la gira.
‫(teclas haciendo clic) Y todavía
‫lo hacemos. virtual.
‫Así que al igual que con este campo virtual
‫aquí, semana de duración, luego escribimos el nombre del campo virtual.
‫Así que llamémoslo
‫'Reseñas' y luego un objeto de algunas opciones.
‫Y el primero es el
‫nombre del modelo al que queremos hacer referencia.
‫Y eso funciona igual que con las referencias normales.
‫(teclas haciendo clic) Así que
‫de nuevo, el nombre del modelo.
‫Entonces, 'Revisión' o curso, en este caso.
‫Y ahora, realmente necesitamos especificar el nombre de los
‫campos para conectar los dos conjuntos de datos.
‫Y esta es, para mí, la parte más complicada de
‫implementar este 'Virtual Populate'. Entonces,
‫asegurémonos de que realmente entiendes esta parte.
‫Entonces aquí, necesitamos especificar dos campos.
‫El campo extranjero y el campo local.
‫Así que comencemos por el campo extranjero.
‫Y entonces, este es el nombre del campo en el otro modelo.
‫Entonces, en el modelo de
‫Revisión en este caso, donde se almacena la referencia al modelo actual.
‫Y eso es, en este caso, el campo del Tour, ¿verdad?
‫Entonces, echemos un vistazo a eso.
‫Y así, nuevamente, en nuestro modelo de revisión, tenemos
‫un campo llamado 'Tour'. 'Y aquí
‫es donde se almacena la identificación del recorrido.
‫Y es por eso que aquí,
‫en este campo extranjero, especificamos el nombre
‫de ese campo para conectar estos dos modelos, ¿de acuerdo?
‫Y ahora debemos hacer lo mismo con el modelo actual.
‫Por lo tanto, debemos decir dónde se almacena realmente
‫esa identificación aquí en este modelo Tour actual.
‫Entonces, campo local.
‫Y eso es, el ID.
‫Entonces, _ID, ¿de acuerdo?
‫Y así, nuevamente, este _ID, que es como
‫se llama en el
‫modelo local, se llama 'Tour' en el modelo extranjero.
‫Entonces, en el modelo Review. ¿Okey?
‫Y de nuevo, así es como
‫conectamos estos dos modelos.
‫Escribamos aquí que
‫esto es 'Virtual Populate', ¿de acuerdo?
‫Y ahora, con esta configuración,
‫podemos usar Populate como lo hicimos antes.
‫Entonces, lo que queremos hacer ahora
‫es seguir adelante y poblar
‫la gira cuando solo tengamos una gira, ¿de acuerdo?
‫Entonces aquí en Postman, está en esta situación de 'Get Tour'. ' ¿Okey?
‫Veamos si esto realmente existe.
‫Y lo hace, pero es esta extraña gira de prueba.
‫Y entonces, hagámoslo con este 'Forest Hiker'.
‫Está bien.
‫Entonces, cuando tengamos este
‫recorrido, ahora queremos completar las reseñas.
‫Y ya debería estar aquí como una matriz vacía.
‫Ah, aquí está.
‫No es una matriz vacía, pero está configurada como 'nula. “Pero el
‫campo virtual ya está
‫ahí con las revisiones.
‫Pero es nulo en este
‫punto porque aún no lo hemos poblado, ¿de acuerdo?
‫Y nuevamente, solo queremos completarlo aquí
‫en el
‫'Obtener un recorrido', y no en el
‫'Obtener todos los recorridos' porque sería
‫demasiada información para enviar a un cliente cuando obtenga todos los recorridos.
‫Además, cuando obtenemos todos los recorridos,
‫generalmente es para crear una página de descripción general.
‫Y en ese
‫caso, normalmente no necesitamos acceder a todas las reseñas.
‫Solo lo necesitamos cuando
‫en realidad estamos mostrando solo una gira.
‫¿Okey? Entonces, creo que
‫tiene sentido hacer esto solo en 'Get One Tour'. 'Entonces, hagamos
‫eso poblar realmente directamente
‫en el controlador.
‫Entonces, el controlador de gira y aquí abajo
‫donde tenemos 'Get Tour'. 'Y así,
‫eso es realmente muy fácil.
‫Solo queda llamar a 'Rellenar' después de
‫la otra consulta, y luego simplemente pasar el nombre del
‫campo que queremos rellenar.
‫Y así, como ya sabemos, eso se llama 'Reseñas. Y, entonces,
‫eso debería ser ya.
‫¿Está bien?
‫Entonces, probemos esto ahora y echemos un vistazo a esto.
‫Y, de hecho, ahora tenemos nuestra revisión completa aquí.
‫¿Está bien? Entonces eso se pobló.
‫Y entonces significa que nuestro Virtual
‫Populate realmente está funcionando.
‫Ahora, puede comenzar a
‫ver que esto está creando
‫una especie de problema porque esto aquí
‫básicamente está creando una cadena de poblados.
‫Y eso no es ideal en absoluto.
‫Entonces, tenemos el recorrido lleno de reseñas.
‫Pero luego las reseñas también se
‫rellenan con el recorrido nuevamente, y también con el usuario.
‫Y luego también el recorrido también
‫se está poblando con guías.
‫Lo que en este caso no está
‫sucediendo porque no hay guías.
‫Pero si lo hubiera, tendríamos otra población más.
‫Y entonces aquí tendríamos una cadena de tres poblaciones.
‫Y entonces, para el rendimiento, eso, por supuesto, no es ideal en absoluto.
‫Especialmente aquí con la gira.
‫Así que tenemos el recorrido repleto de reseñas.
‫Y en las reseñas, volvemos a tener los datos sobre el recorrido.
‫Y eso no tiene mucho sentido en absoluto.
‫Entonces, ahora es un desastre.
‫Entonces, la solución que voy a usar
‫aquí es desactivar
‫la información de las reseñas con los recorridos, ¿de acuerdo?
‫Básicamente, no necesitamos estos datos aquí en cada revisión.
‫Entonces, en este caso, creo que es una buena solución.
‫Pero claro, de nuevo en tu caso, siempre
‫dependerá de cómo funcione
‫tu aplicación en tu caso específico.
‫Pero en esta aplicación, es más lógico tener realmente
‫las reseñas disponibles en los
‫recorridos, y no es tan importante tener
‫el recorrido disponible en la reseña, ¿de acuerdo?
‫Entonces, apaguemos ese poblado básicamente, en el
‫modelo de Revisión.
‫¿Okey?
‫Entonces, comentemos esta parte,
‫cópiela
‫aquí y, básicamente, eliminemos esta primera.
‫¿Ahora bien?
‫Prepárate para ahorrar.
‫Vamos a intentarlo otra vez.
‫Entonces, ahora solo deberíamos ver la identificación del recorrido aquí.
‫¿Okey? Y de hecho, eso es exactamente lo que obtenemos.
‫¿Okey? Ahora, con esto,
‫por supuesto, todavía hacemos referencias a los padres, ¿de acuerdo?
‫Todavía guardamos una referencia a los recorridos aquí,
‫pero simplemente no la completamos.
‫Y nuevamente, porque no
‫siempre necesitamos esos datos aquí.
‫Está bien. Recapitulemos rápidamente lo que hicimos aquí.
‫Entonces, comenzamos a hacer solo referencias de padres en la revisión.
‫Pero eso hizo que en
‫los recorridos no tuviéramos acceso a sus reseñas correspondientes.
‫Y la solución más fácil para
‫eso sería hacer también referencias de niños en los recorridos.
‫Pero el problema con
‫eso sería que en realidad no queremos
‫mantener una matriz de todos
‫los documentos secundarios en el documento principal, ¿verdad?
‫Porque nuevamente, no
‫queremos permitir que las matrices crezcan indefinidamente.
‫Entonces, en
‫lugar de hacer eso, implementamos poblados virtuales como este.
‫¿Está bien? Así que, así.
‫Y esto nos permite hacer básicamente exactamente lo mismo.
‫Por lo tanto, mantener una referencia a todos
‫los documentos
‫secundarios en el documento principal, pero sin conservar esa
‫información en la base de datos.
‫Y entonces, después de haber configurado este
‫poblado virtual, todo lo que teníamos que hacer
‫es básicamente usar Populate como lo hicimos antes con las referencias reales.
‫Y luego, finalmente, también
‫apagamos uno de los poblados que teníamos en la revisión.
‫Entonces, este de aquí, donde
‫completamos el ID de la gira, porque
‫eso estaba creando una cadena ineficiente de poblados.
‫Y eso es, por supuesto, algo que no queremos.
‫Y así, al
‫final, terminamos con un resultado como este, ¿de acuerdo?
‫Excelente.
‫Entonces, espero que tenga sentido para ti.
‫Y así, con esto,
‫por ahora terminamos de esta parte de la población, ¿de acuerdo?
‫Y ahora pasemos al siguiente tema,
‫que básicamente es la creación de rutas anidadas.