‫Instructor: Ahora que conoce
‫los conceptos básicos de Mongoose
‫mediante la implementación de las cuatro
‫operaciones correctas, ahora finalmente importa un poco más los datos de nuestro
‫recorrido para que los recorridos sean más completos.
‫Entonces, en este punto, nuestros documentos de viaje solo pueden tener un
‫nombre, una calificación y un precio.
‫Pero, por supuesto, necesitamos muchos más datos
‫aquí, porque el objetivo es tener una API muy rica en
‫datos, como esta.
‫Así que echemos un vistazo a la
‫versión final aquí como referencia.
‫Y ese es este de aquí.
‫Entonces tenemos todas las
‫giras, y se verá un poco así.
‫Bien, entonces ves que en cada
‫recorrido, tenemos una ubicación de inicio, tenemos un promedio de
‫calificaciones, cantidad de calificaciones, imágenes, fechas de inicio.
‫Guías, nombre, duración, tamaño máximo del grupo, dificultad, precio,
‫resumen, descripción,
‫portada de la imagen, ubicaciones.
‫Incluso una babosa, reseñas, duración en semanas y la identificación.
‫Así que ven una gran cantidad de
‫datos, y no vamos a agregar todos los datos
‫en esta conferencia aquí.
‫Hay algunas piezas que todavía no podemos agregar,
‫pero, por supuesto, podemos hacerlo un poco más completo, ¿de acuerdo?
‫Guardemos esto aquí, como referencia, y obtengamos todos los
‫recorridos, y lo pondré fuera
‫de cualquier carpeta.
‫Así que pongámoslo aquí en la parte superior.
‫Y eso no funciona por alguna razón.
‫Bien, pongámoslo aquí, entonces.
‫Está bien, vamos, eso es
‫correcto.
‫Y nuevamente, lo dejo aquí,
‫para seguir comparando lo que tenemos con
‫lo que apuntamos.
‫De todos modos, regresemos y comencemos con
‫lo que ya tenemos, y tenemos
‫el nombre.
‫Y eso ya es suficientemente
‫bueno, así que por ahora lo dejaré así.
‫Entonces el nombre, luego también queremos una duración.
‫Y esa duración es un número, y se requiere.
‫Así que configúrelo en verdadero, y luego
‫el mensaje es, un recorrido debe tener una duración.
‫Entonces, estos validadores requeridos aquí básicamente son los
‫únicos validadores que agregaré a
‫cada uno de estos campos aquí por ahora.
‫Más adelante, cuando hablemos más
‫en detalle sobre validadores, agregaremos mucho más.
‫Pero nuevamente, por ahora, solo
‫quiero que algunos de estos campos, no todos, sean obligatorios.
‫A continuación, tenemos el tamaño del grupo.
‫Entonces, básicamente, cuántas personas pueden participar
‫como máximo en una gira.
‫Y por eso lo llamo maxGroupSize.
‫Y entonces, nuevamente debería
‫ser un número, y nuevamente se requiere.
‫El tour debe tener un tamaño de grupo.
‫No olvide la coma aquí.
‫A continuación, también necesitamos una dificultad.
‫Y este es una cadena, y más adelante,
‫definiremos que debería ser medio,
‫fácil o difícil, pero nuevamente, eso
‫es en realidad un
‫validador, y lo dejaré para más adelante.
‫De acuerdo, por ahora, solo digo
‫que debería tener una dificultad.
‫A continuación, hablemos de las calificaciones.
‫Así que ahora mismo tenemos un campo llamado Calificación, pero
‫de hecho queremos tener un campo para
‫el promedio de calificación
‫y un campo para la cantidad de calificaciones.
‫Básicamente, la cantidad de calificaciones que hay.
‫Entonces, más adelante, habrá otro recurso llamado reseñas,
‫donde los usuarios podrán escribir reseñas
‫sobre recorridos y calificar.
‫Y ese será un recurso completamente diferente
‫y un modelo completamente diferente.
‫Pero aún así, queremos tener básicamente un
‫resumen de estas calificaciones y de estas reseñas aquí en los recorridos.
‫Muy bien, y las razones de eso las aprenderá
‫un poco más tarde una vez que comencemos cómo y por qué modelamos datos en
‫bases de datos NoSQL, y específicamente en MongoDB.
‫Bien, por ahora, agreguemos el promedio de calificaciones y la
‫cantidad de calificaciones.
‫Bien, dejamos esto aquí como número,
‫y con este
‫valor predeterminado, y la cantidad de calificaciones, ratingsQuantity.
‫Por supuesto, también debería ser un número,
‫y el valor predeterminado será cero.
‫Porque, por supuesto, al principio,
‫no habrá absolutamente ninguna revisión, cuando la gira sea nueva.
‫Ahora bien, no le di a estas dos
‫propiedades aquí un valor requerido, porque no es
‫el usuario que
‫crea estos recorridos quien realmente especificará estos valores, ¿verdad?
‫Entonces, cuando creamos
‫un nuevo recorrido, nunca especificaremos las calificaciones
‫Promedio, ni las calificaciones Cantidad,
‫porque eso se calculará más adelante
‫a partir de las críticas reales, ¿de acuerdo?
‫A continuación, tenemos el precio aquí,
‫así que está bien
‫así, y también podríamos tener un descuento.
‫Entonces, digamos que esta
‫empresa, Natours, quiere dar un descuento a uno de los tours en
‫algún momento, por lo que también
‫pueden especificar un precio de descuento aquí.
‫Así que priceDiscount, así que pongámoslo aquí en el número.
‫No necesitamos ninguna opción de tipo de esquema aquí.
‫Por ejemplo, no es
‫obligatorio, así que por ahora, dejémoslo así.
‫A continuación, podemos especificar un resumen del recorrido.
‫Entonces el resumen es de tipo String.
‫Pero en realidad no lo haré obligatorio.
‫Bien, y eso es simplemente porque no
‫está en la página principal de nuestro sitio web.
‫Bien, básicamente no está en la descripción general.
‫Y les mostraré eso en un segundo,
‫pero por ahora permítanme
‫agregar aquí otra opción de tipo de esquema que aún no les
‫mostré, que se llama recortar.
‫Y recortar solo funciona para cuerdas.
‫Y lo pondré en verdad.
‫Entonces, recuerde cómo dije que hay diferentes tipos de esquemas
‫para diferentes tipos aquí, y por lo
‫tanto, para la cadena, tenemos un tipo de esquema que es
‫recorte que eliminará todo el espacio
‫en blanco al principio y al final de la cadena.
‫Está bien, y si alguien
‫entra, por ejemplo, esta gira, bla, bla, bla, no importa.
‫Entonces, si alguien ingresa esto, entonces todo
‫este espacio en blanco al
‫final y al principio aquí se cortará.
‫Y de hecho, podemos poner lo mismo en el nombre,
‫por ejemplo, aquí.
‫De acuerdo, ¿por qué no?
‫Así que dejémoslo así.
‫Aquí veo que en realidad se llama duración,
‫no duraciones.
‫Muy bien, ese es el resumen, que también está mal escrito.
‫Tan resumen como este.
‫Ah, y sí, ahora quería mostrarte el
‫sitio web de Natours, de hecho.
‫Así que volvamos a nuestra documentación de Mongoose.
‫Pero esto es lo que quiero mostrarte.
‫Así que Natours. dev, que es el original de esta aplicación,
‫por lo que estos son los datos que tenemos en nuestra API y
‫que, por supuesto, también necesitamos en la base de datos.
‫Entonces tenemos todos estos datos.
‫Entonces, el nombre de este tour, tenemos la dificultad, tenemos la duración, tenemos,
‫esto es un resumen, luego tenemos una
‫ubicación de inicio, tenemos la cantidad de ubicaciones, tenemos
‫una fecha de inicio, tenemos
‫el tamaño máximo de
‫grupo en aquí, y tenemos que fijar el
‫precio, el promedio de calificación, la
‫cantidad de calificación.
‫También tenemos una imagen aquí.
‫Y luego aquí en la página de detalles es donde
‫tenemos, tenemos el resumen aquí abajo.
‫Tenemos las guías que les acabo de mostrar en Postman antes.
‫Tenemos algunas imágenes más.
‫Tenemos aquí todas las ubicaciones y tenemos
‫todas las reseñas.
‫De acuerdo, como les decía, no todos los
‫datos están en la página Descripción general, por lo que
‫no todos los datos también son obligatorios.
‫Bien, volvamos aquí.
‫A continuación, quiero agregar una descripción.
‫Y este es un tipo de String, y
‫establezcamos trim en verdadero nuevamente.
‫Y acabo de recordar que
‫el resumen está en realidad en la página Descripción general.
‫Y entonces hagamos este requerido.
‫Entonces agrega aquí al
‫final,
‫cierto, un recorrido debe tener una descripción.
‫Bien, a continuación, especificaremos imageCover.
‫Y esas son las imágenes que ve en la página de
‫descripción general, así que configuremos esta para que realmente requiera este rol.
‫Entonces, el tipo debería ser cadena, porque
‫básicamente este será simplemente el nombre de
‫la imagen aquí, que
‫luego podremos leer desde el sistema de archivos.
‫Bien, en realidad solo el nombre de la imagen.
‫Entonces, básicamente, se almacenará una referencia en la base de datos.
‫Y esa es una práctica muy común, ¿de acuerdo?
‫Así que también podríamos almacenar la imagen completa en una base de datos, pero por
‫lo general no es una buena idea.
‫Simplemente dejamos las imágenes en algún lugar del sistema de archivos y luego
‫colocamos el nombre de la imagen en la base
‫de datos como un campo.
‫Por lo tanto, configúrelo como obligatorio,
‫es cierto, un recorrido debe tener una imagen de portada.
‫Bien, la siguiente es el resto de imágenes.
‫Y ahora aquí tenemos algo nuevo, ¿de acuerdo?
‫Porque tenemos varias imágenes
‫y quiero guardar esas imágenes como una matriz.
‫Y de hecho, como una matriz de cadenas.
‫Entonces, la forma de hacerlo es
‫simplificar, especificar aquí una matriz de cadenas, como esta.
‫Así que quiero que siga siendo de tipo cadena, pero
‫quiero que sea una matriz.
‫Entonces, una matriz en la que tenemos varias cadenas.
‫Y así es como puedo definir esto, ¿de acuerdo?
‫Y usaremos esto más tarde para otra cosa.
‫Entonces, en realidad pasaremos más
‫opciones de tipo de esquema que solo
‫un tipo, y para entonces lo usaremos nuevamente, ¿de acuerdo?
‫Por ahora, sin embargo, sigamos adelante,
‫y el siguiente campo que quería
‫agregar aquí es createdAt.
‫Y el campo createdAt debería ser básicamente una marca de
‫tiempo que se establece en el momento en que el usuario obtiene un nuevo recorrido.
‫Por lo tanto, esto aquí debería agregarse automáticamente.
‫Nuevamente, en el momento en que se crea el recorrido.
‫¿Entonces cómo hacemos eso?
‫Bueno, en primer lugar, configuramos el tipo en Fecha.
‫Entonces, Data es otro tipo de datos integrado en JavaScript, y
‫podemos usarlo aquí.
‫Bien, entonces el tipo es Fecha, y luego
‫simplemente necesitamos establecer un valor predeterminado, y el
‫valor predeterminado es la
‫función incorporada de JavaScript Fecha. ahora.
‫Y estoy seguro de que está familiarizado con este.
‫Entonces, esto simplemente nos dará una marca de tiempo
‫en milisegundos, que básicamente representa el milisegundo actual.
‫Muy bien, ahora
‫en Mongo, esto ahora se convierte inmediatamente a la fecha
‫de hoy para darle más sentido a estos datos, ¿de acuerdo?
‫Así que sí, esa es la marca de tiempo creada automáticamente.
‫Y ahora, finalmente, también necesitamos pasar una serie de fechas.
‫Y ahora, finalmente, para terminar
‫por ahora, también queremos poder definir una matriz de fechas de inicio.
‫Entonces, startDates, y nuevamente, simplemente definimos una matriz, y luego
‫decimos que allí queremos fechas.
‫Muy bien, estas fechas de inicio son básicamente fechas diferentes en
‫las que comienza una gira.
‫Por ejemplo, podemos tener una gira
‫que comience en diciembre
‫de este año, y luego en febrero,
‫el próximo año, y luego otra
‫en el verano, por lo que diferentes fechas
‫para la misma gira son
‫simplemente diferentes, digamos, instancias de la gira. comenzando en diferentes fechas.
‫Muy bien, espero que tenga sentido.
‫De todos modos, este aquí no será
‫creado automáticamente por MongoDB, y MongoDB automáticamente intentará
‫analizar la cadena que pasamos como fecha en una
‫fecha real de JavaScript.
‫Por ejemplo, podríamos pasar algo
‫como, digamos, 2021, 21 de marzo, y nuevamente
‫Mongo lo analizaría automáticamente
‫como una fecha.
‫También puede especificar la fecha.
‫Por ejemplo, decir 11 y 32 minutos, está bien.
‫O también podríamos simplemente ingresar una marca de tiempo de Unix, por lo
‫que una marca de tiempo como en este formato aquí.
‫Bien, y todos estos
‫formatos, básicamente, Mongo intentará analizarlos en una fecha.
‫Y solo si no puede, arrojará un error.
‫(exhala) Así que esto fue mucho trabajo.
‫Vamos a salvarlo aquí.
‫Y la forma en que podemos probar esto es ir
‫aquí a nuestros datos de desarrollo, donde tenemos
‫este recorrido simple. json, que es
‫el que hemos estado usando en una sección anterior.
‫Está bien.
‫Entonces, todo lo
‫que voy a hacer aquí es simplemente tomar
‫todos estos datos aquí y luego usarlos para crear una nueva solicitud, ¿de acuerdo?
‫Así que queremos crear una nueva solicitud POST aquí, y con
‫todos esos datos,
‫en lugar de tener que escribirla manualmente.
‫Bien, pegando todo esto aquí.
‫Y ahora, de hecho, no necesitamos la identificación.
‫Así que lo
‫necesitábamos antes, cuando estábamos haciendo nuestra API basada
‫en archivos, pero eso ya se acabó, así que eliminémoslo.
‫Entonces, todo el
‫resto de los datos que marcamos que son obligatorios ahora están
‫aquí, e incluso algunos más.
‫Intentemos ver qué sucede cuando enviamos esto.
‫Y ahora recibimos datos no válidos enviados.
‫Así que vayamos a nuestro controlador de recorrido, y aquí, donde
‫creamos un recorrido, en lugar de este mensaje,
‫retrocedamos como lo teníamos antes y enviemos
‫el error completo para que veamos qué es
‫lo que realmente está yendo mal.
‫Así que mándalo aquí, vale, y el problema es que
‫ya tenemos definida The Snow Adventure.
‫Así que primero eliminémonos de eso.
‫Sí, aquí tenemos The
‫Snow Adventure, así que deberíamos eliminar
‫esto, y para eso, estoy usando nuestra propia API,
‫por lo que ya podemos usarla aquí.
‫Así que ahora debería haber
‫desaparecido, y ahora deberíamos poder agregar esto como una nueva gira.
‫Y de hecho, ahora está aquí.
‫Así que aquí están todos los datos que
‫acabamos de especificar en este bonito formato.
‫Entonces, lo que es interesante ahora es ver
‫realmente la marca de tiempo createdAt.
‫Ese es el momento exacto en el que estoy grabando este video.
‫Y este, por supuesto, fue creado
‫automáticamente por este fragmento de código que tenemos en algún lugar aquí.
‫Sí, esto.
‫Entonces esa fecha viene de esta Fecha. ahora marca de
‫tiempo que JavaScript luego analiza automáticamente
‫a esta fecha agradable y legible.
‫Entonces aquí tenemos estas matrices.
‫Bien, entonces esta matriz y
‫otra matriz, y por supuesto, la ID generada automáticamente, ¿de acuerdo?
‫Entonces, si venimos aquí
‫ahora, tendremos, por supuesto, tres recorridos.
‫Primero, los otros que no son tan completos,
‫y luego todos estos.
‫Ahora, lo que es interesante ver aquí
‫es que Mongo también actualizó el tipo de recorridos que ya teníamos.
‫Entonces, por ejemplo, teníamos calificación aquí,
‫pero ahora que nuestro esquema cambió por
‫completo, luego agregó este promedio de calificaciones, y
‫también esta cantidad de calificaciones, tanto a sus valores predeterminados como a
‫lo mismo aquí.
‫También creó esta marca de tiempo.
‫Creó, sí, creó imágenes y fechas de inicio, con
‫estas matrices vacías.
‫Y así cambió todos estos datos aquí.
‫Muy bien, y antes de comenzar a avanzar en
‫un proyecto, probablemente deberíamos
‫seguir adelante y eliminar todos estos datos aquí.
‫Y, de hecho, lo que vamos a hacer
‫en el siguiente video, ahora que nuestro modelo finalmente
‫está completo, al menos
‫para esta sección, seguiremos adelante y
‫escribiremos un pequeño script que importará automáticamente todos los
‫recorridos de estos datos JSON.
‫Bien, de este archivo JSON, en realidad.
‫Así que básicamente leerá el archivo,
‫obtendrá todos los recorridos y los importará a la base de datos.
‫Muy bien, eso es lo que haremos a continuación,
‫porque será muy útil en esta sección
‫y también en el futuro.