El curso de Express. js - módulo 8: modelado de relaciones con Mongoose | Shivendra Raghuvanshi | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

El curso de Express. js - módulo 8: modelado de relaciones con Mongoose

teacher avatar Shivendra Raghuvanshi, Lead Developer and Online Teacher

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      2:37

    • 2.

      Modelado de relaciones de datos con Mongoose

      9:03

    • 3.

      Referencia de documentos en Mongoose

      4:09

    • 4.

      Domina la población en mangoose

      4:21

    • 5.

      Incrusta documentos con Mongoose

      8:13

    • 6.

      Matrices de subdocumentos en Mongoose

      5:38

    • 7.

      Configurar MongoDB para transacciones

      9:08

    • 8.

      Realiza transacciones con Mongoose

      7:39

    • 9.

      ObjectID en MongoDB

      7:11

    • 10.

      Validación de ObjectID con Joi

      10:37

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

2

Estudiantes

--

Proyecto

Acerca de esta clase

Módulo 8: modelado de relaciones con Mongoose lleva tus habilidades de desarrollo de backend más allá al sumergirte en el arte de diseñar y gestionar relaciones entre entidades de datos en MongoDB. Aprenderás a estructurar de manera efectiva tus datos para aplicaciones del mundo real, utilizando Mongoose para modelar relaciones simples y complejas. Al final de este módulo, tendrás el conocimiento y la confianza para diseñar bases de datos escalables para una amplia variedad de proyectos.

Lo que aprenderás

  • Los principios del modelado de relaciones de datos en Mongoose.
  • Referencia a documentos y domina la población para recuperar datos relacionados.
  • Incrusta documentos y trabaja con matrices de subdocumentos.
  • Gestiona enfoques híbridos para lograr flexibilidad y rendimiento.
  • Usa transacciones de MongoDB para operaciones fiables de varios pasos.
  • Valida los ObjectID y garantiza la integridad de la base de datos.

Conoce a tu profesor(a)

Teacher Profile Image

Shivendra Raghuvanshi

Lead Developer and Online Teacher

Profesor(a)
Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: Bienvenido de nuevo al Módulo ocho relaciones de modelaje con Mongoose Esta clase es una continuación de la serie de cursos Express JS. Mi nombre es Shawn Ragunhi y seré su guía mientras nos sumergimos avanzadas de diseño de bases de datos He tenido el privilegio de trabajar en varias aplicaciones de grado de producción sin JS, y estoy emocionado de compartir mis ideas con ustedes. Algunos de mis mejores trabajos incluyen diseñar sistemas escalables de alto rendimiento que dependen de bases de datos bien estructuradas, y hoy aprenderás a hacer lo mismo. En este módulo, nos estamos enfocando en modelar las relaciones en Mongoose, lo cual es esencial para cualquier aplicación que interconectara datos Esto es lo que aprenderá a modelar las relaciones usando referencias e incrustaciones de documentos, administrando matrices de subdocumentos y trabajando con transacciones MongAV También aprenderá a validar ID de objeto para mantener la integridad de su base de Esta clase es perfecta para desarrolladores backend que ya tienen algo de experiencia con Express Js y Mongo DB Si has completado los módulos anteriores, estás bien preparado para ello. No necesitará Js, Express, Mongo DB y mangos instalados, junto con una comprensión básica de las operaciones de multitudes Comprender cómo modelar las relaciones de datos es clave para construir aplicaciones escalables, mantenibles y eficientes Al final de este módulo, no solo sabrás cómo estructurar relaciones complejas en Mongadib sino que también obtendrás experiencia práctica en el diseño de APIs que funcionan a la perfección en escenarios del mundo real En este módulo, trabajaremos en dos proyectos. Primero, construirás API del auto para administrar autos en nuestro sistema, aprendiendo a incrustar y referenciar documentos de manera efectiva. A continuación, desarrollará la API de alquileres, que incluye la creación y recuperación de alquileres, validación de ID de objetos y el manejo transacciones para garantizar la confiabilidad de los datos Estos proyectos te darán una experiencia práctica implementando técnicas avanzadas de bases de datos. Por lo que este módulo está repleto de lecciones prácticas y proyectos que elevarán tus habilidades de desarrollo de backend Empecemos, y te veré en la primera conferencia. 2. Modelado de relaciones de datos con Mongoose: En todos los ejemplos que hemos buscado hasta ahora, hemos trabajado con documentos independientes únicos. Pero en el mundo real, las entidades y conceptos con los que trabajamos, tienen algún tipo de asociación. Por ejemplo, puede tener un objeto de curso o un documento de curso. Y, por supuesto, este curso tiene un autor, pero un autor es algo más que un nombre. Es más que una simple cuerda. Podríamos tener una colección de autores donde almacenamos documentos de autor, y en cada documento de autor, podemos tener propiedades como nombre, sitio web, imagen, etc. Entonces en esta conferencia, voy a hablar sobre cómo trabajar con objetos relacionados. Básicamente, tenemos dos enfoques. Una es usar referencias, que llamamos normalización, y el otro enfoque es usar documentos incrustados, que llamamos desnormalización Entonces veamos cómo funcionan estos. Con el primer enfoque, deberíamos tener una colección separada para almacenar a nuestros autores. Entonces podemos tener un objeto autor como este. Aquí tenemos todo tipo de propiedades, y luego tendremos una colección separada donde almacenamos objetos del curso como este. Entonces aquí tenemos un objeto curso. Ponemos al autor a la identificación de un documento de autor en la colección del autor. Aquí estamos usando una referencia. Ahora necesito aclarar algo aquí. En las bases de datos relacionales, tenemos este concepto de relación que hace cumplir la integridad de los datos Pero en Mongo DV o sin bases de datos SEQL en general, no tenemos relación Entonces, a pesar de que aquí estoy configurando la identificación de un autor, en realidad no hay asociación ni relación entre estos dos documentos en la base de datos. En otras palabras, puedo establecer esto en una identificación no válida, y a Mongo DV no le importa eso Ahora, podríamos llevar este ejemplo al siguiente nivel. Digamos que un curso podría tener múltiples autores. Entonces, en lugar de la propiedad del autor, podríamos tener autores, que establecemos en una matriz de referencias. Así que aquí almacenaremos múltiples IDs. Ahora, por simplicidad, solo trabajemos con un solo autor. Entonces voy a eliminar esta parte. Entonces este es nuestro primer enfoque, que implica el uso de referencias. Hay otro enfoque. Entonces, en lugar de tener una colección separada de autores, podemos incrustar un documento de autor dentro de un documento del curso. Entonces aquí podemos tener un objeto de curso o un documento de curso. En este documento, tenemos la propiedad author y la configuramos en un objeto. Entonces aquí, tendremos todas las propiedades de un autor. Entonces estamos incrustando un documento dentro de otro documento. Bien. Y esto es lo que llamamos desnormalización Ahora bien, si nunca antes hemos trabajado con bases de datos iguales de nariz y vienes de un fondo de base de datos relacional, puedes pensar que el primer enfoque es el Vu Pero ese no es necesariamente el caso cuando se trabaja con bases de datos iguales de nariz. Cada enfoque tiene sus fortalezas y debilidades. enfoque que elija realmente depende su aplicación y sus requisitos de consulta Entonces, básicamente, necesitas hacer un intercambio entre el rendimiento de la consulta y la consistencia. Déjame explicarte a qué me refiero con eso. Con el primer acercamiento, tenemos un solo lugar para definir a un autor. Si mañana decido cambiar el nombre de este autor de labrado a talado, hay un solo lugar que necesito modificar, y todos los cursos que están haciendo referencia a ese autor verán inmediatamente al autor Entonces con el primer enfoque, tenemos consistencia. Sin embargo, cada vez que queremos consultar un curso, necesitamos hacer una consulta extra para cargar al autor relacionado. Ahora a veces esa consulta extra puede no ser gran cosa. Pero en ciertas situaciones, quieres asegurarte de que tus consultas se ejecuten lo más rápido posible. Si ese es el caso, debe mirar el segundo enfoque utilizando documentos incrustados. Entonces, con este enfoque, podemos cargar un objeto de curso y es autor usando una sola consulta. No tenemos que hacer una consulta adicional para cargar al autor porque el autor está dentro del objeto del curso o del documento del curso. No obstante, con este enfoque, si mañana decido cambiar el nombre de este autor de labrado a Shevin, lo más probable es que haya múltiples documentos del curso que necesiten ser actualizados Y si nuestra operación de actualización no compite con éxito, es posible que tengamos algunos documentos del curso que no estén actualizados. Entonces terminaremos con datos inconsistentes. Entonces el primer enfoque nos da consistencia. El segundo enfoque nos da rendimiento. Por eso te dije que necesitas hacer un intercambio entre consistencia y desempeño. No puedes tener a los dos al mismo tiempo. Entonces, en cada parte de tu aplicación, necesitas pensar en las consultas que vas a ejecutar con anticipación, y diseñarás tu base de datos en función de esas consultas. Entonces estos son los principios generales. Ahora tenemos un tercer enfoque. Lo que llamamos el enfoque híbrido. Por ejemplo, imagina que cada autor tiene 50 propiedades. No queremos duplicar todas esas propiedades dentro de cada curso en nuestra base de datos, por lo que podemos tener una colección separada de autores. Pero en lugar de usar una referencia aquí, podemos incrustar un documento de autor dentro de un documento de curso, pero no la representación completa de ese autor. Quizás solo queremos el nombre propiedad. Entonces con el enfoque híbrido, nuestra base de datos se verá así. Entonces tenemos una colección de autores. En esta colección, tendremos objetos de autor como este. Tenemos el nombre Chevan, y aquí tendremos otras 50 propiedades Ahora tendremos una colección separada de cursos. En esta colección, tendremos documentos del curso como este. Entonces autor, establecemos esto a un documento, y en este documento, solo tendremos dos propiedades. Uno es ID. Esa es una referencia a un documento de autor. También tenemos clavo. Con este enfoque, podemos leer rápidamente un objeto de curso junto con este autor, por lo que podemos optimizar el rendimiento de nuestra consulta, pero no tenemos que almacenar todas esas propiedades de un autor dentro de un documento del curso. Ahora bien, este enfoque es particularmente útil si quieres tener una instantánea de tus datos en algún momento. Por ejemplo, imagina que estás diseñando una aplicación de comercio electrónico. Allí tendremos colecciones como pedidos, productos, carritos de compras, etc. En cada pedido, necesitamos almacenar una instantánea de un producto porque queremos conocer el precio de ese producto en un momento dado. Entonces ahí es donde usaremos el enfoque híbrido. Entonces, una vez más, qué enfoque eliges realmente depende la aplicación que estés construyendo. No hay bien o mal. Cada enfoque tiene fortalezas y debilidades. En las próximas conferencias, voy a mostrarles cómo implementar cada uno de estos enfoques. 3. Referencia de documentos en Mongoose: En esta conferencia, voy a mostrarles cómo hacer referencia a un documento en otro documento. Si quieres de junto conmigo, descarga este archivo. He adjuntado a esta conferencia. En este archivo, poblar los Js. Tenemos dos modelos. El primero es autor con tres propiedades, nombre, biografía y sitio web. El otro modelo es coors con un nombre de propiedad. En esta conferencia, vamos a agregar otro autor de propiedad, y ahí haremos referencia un documento de autor en nuestra base de datos. También tenemos algunas funciones de ayuda. Uno es crear autor. El otro es crear curso, y el último es lista de cursos. Todas estas funciones son similares a lo que hemos visto anteriormente en esta sección. Entonces no hay nada nuevo aquí. Ahora, antes de comenzar, quiero que vayas a Mongo DB Compass y elimines la base de datos de playground Queremos comenzar en un lienzo limpio. Así que escribe aquí patio de recreo para eliminar esta base de datos. Bien, ahora en la parte inferior de este archivo, se puede ver, tenemos una llamada para crear la función de autor, crear un autor llamado Chewn con estas propiedades Así que abre el terminal y ejecuta el nodo, opular JS. Entonces creamos un autor, y aquí está la idea de este autor. Bien, ahora copia esto de nuevo al código. Comprometamos esta línea, creemos autor y habilitemos crear curso. Entonces aquí queremos crear un curso llamado curso nodo para este nuevo autor. Entonces se pasa el ID de autor como una cadena. Ahora bien, si nos fijamos en la implementación de esta función, aquí creamos un objeto de curso con dos propiedades, name y author. Ahora, guarda el archivo. De vuelta en la terminal. Ejecutemos este programa una vez más. Así que creamos este objeto de curso. Aquí está la idea del curso, el nombre del curso, pero no tenemos al autor. La razón de esto es porque definimos este modelo de curso, solo agregamos la propiedad name. Entonces, al guardar un objeto de curso, solo las propiedades que hayas definido en tu modelo serán persistidas en la base Entonces aquí necesitamos agregar otra propiedad, autor. Le dijimos esto a un objeto de tipo esquema. El tipo de esta propiedad debe ser ID de objeto. Entonces usamos el esquema de mangosta, dottypes ID de objeto. Además, establecemos una propiedad llamada ref y aquí agregamos el nombre de la colección de destino que es así en esta propiedad de autor, almacenaremos un ID de objeto que haga referencia a un documento de autor. Pero una vez más, realmente no tenemos una relación adecuada. Aquí, podemos almacenar un curso con un autor inválido, y MongoDB no se queja Así que hemos modificado nuestro modelo ahora de vuelta en el nodo terminal, OpulateJS así que aquí está nuestro nuevo objeto de curso Puedes ver que tenemos la propiedad de autor ahora de vuelta en MongoDB Campus Veamos esta base de datos de juegos infantiles. Aquí está nuestra colección de cursos. Para que veas que tenemos dos documentos. El primero no tiene autor, pero el segundo sí. Entonces aquí tenemos un ID de objeto que está haciendo referencia a un autor 4. Domina la población en mangoose: Ahora es el momento de obtener todos los cursos junto con sus autores. Así que vamos a desactivar, crear la función de curso, y habilitar esta función lista de cursos. Entonces en esta función, estamos llamando al método find. Obtenemos todos los cursos, y estamos seleccionando solo su propiedad de nombre. Digamos los cambios, Bolsa en el nodo terminal, OpulateTjs Mira, solo tenemos ID de subrayado y nombre. Ahora aquí, si agrego autor y ejecuto este programa una vez más, mira, nuestro segundo documento tiene un autor, pero solo estamos obteniendo la referencia o el ID del objeto. En una aplicación del mundo real, queremos cargar este documento de autor para que podamos mostrar su nombre. Ahí es donde usamos el método populate. Entonces aquí una multa, podemos llamar a poblar como primer argumento, especificamos la ruta se les dio propiedad Entonces en este caso, nuestra propiedad es de autor. Y porque antes al definir el modelo de curso, echemos un vistazo aquí. Entonces aquí está nuestro modelo de curso. Al definir esto, establecemos que author sea un ID de objeto, y hacemos referencia a la colección del autor. Entonces, cuando cargamos un objeto de curso y poblamos la propiedad author, Mongoose sabe que debe consultar la colección del autor en Mongo Para volver a la lista de cursos funtion, simplemente llamamos poblar y pasar autor es el nombre de la propiedad de destino Ahora veamos qué pasa. Así que de vuelta en la terminal, vamos a correr esto una vez más. Bien, mira, nuestro primer documento, nuestro primer curso no tiene autor, así que no obtenemos nada. Pero nuestro segundo documento, nuestro segundo curso tiene un autor, y aquí tenemos una representación completa de un documento de autor. Ahora en una aplicación del mundo real, un autor puede tener múltiples propiedades. Quizás al mostrar la lista de cursos, no queremos obtener todas esas propiedades adicionales. Solo queremos obtener el nombre propiedad. Así que de vuelta en el tablero, al llamar al método populate, como segundo argumento, puedes especificar las propiedades que deseas incluir o excluir Entonces queremos incluir solo nombre. Ahora de vuelta a la terminal, ejecutemos esta aplicación una vez más. Entonces esta vez, nuestra propiedad de autor es un objeto con solo dos propiedades ID y nombre. Ahora también podemos excluir esta propiedad ID de subrayado. Así que de vuelta aquí, agregamos guión para excluir la propiedad, y el nombre de la propiedad objetivo es subrayado ID Digamos, de vuelta en la terminal, corramos esto una vez más. Y ahora nuestra propiedad de autor es un objeto con una sola propiedad. Nombre. También es posible poblar múltiples propiedades Por ejemplo, imaginemos que cada curso tiene una categoría y una categoría hace referencia a un documento de categoría. Entonces aquí podemos llamar a poblar nuevamente en categoría, y a menudo elegir solo la propiedad name de cada documento de Ahora, déjame mostrarte una última cosa antes de terminar esta conferencia. Antes, te dije que en Mongo DB, no tenemos relaciones para integridad de los datos en nuestra base Así que aquí en nuestra colección de cursos, es posible establecer este autor con documento inválido. Entonces cambiemos estos dos en lugar de dos C uno, C. No tenemos un autor con este ID en esta base de datos. Verás, MongoDB está perfectamente bien con esta operación. Ahora de vuelta a la terminal, ejecutemos este programa una vez más. Ver ahora nuestro autor es nulo porque no hay autor con un ID dado en nuestra base de datos. 5. Incrusta documentos con Mongoose: En la última conferencia aprendiste a usar las referencias para relacionar documentos. En esta conferencia, vamos a ver otra técnica que es incrustar documentos Entonces si quieres cotizar junto conmigo, descarga este archivo, lo he adjuntado a esta conferencia, embargando dot js Entonces aquí tenemos este esquema de autor exactamente como lo que tuvimos en la última conferencia. Cuenta con tres propiedades, nombre, biografía y página web. Tenemos este modelo de autor. Debajo de eso, tenemos el modelo de curso. Ahora aquí, no tenemos la propiedad del autor, y eso es lo que vamos a agregar en esta conferencia. Entonces agregamos la propiedad del autor. Ahora en la última conferencia, pusimos autor a una idea objeto. Entonces echemos un vistazo. Aquí está nuestro modelo de curso de la última conferencia. Mira, aquí está la propiedad del autor. Establecimos el tipo de esta propiedad en un ID de objeto y hacemos referencia a la colección del autor. En esta conferencia, vamos a incrustar un documento de autor directamente dentro de un documento del curso. Entonces establecemos el tipo de esta propiedad a author schema. Eso se define aquí. Bien, ese es el único cambio que necesitamos hacer. Ahora echemos un vistazo a la función create course. Toma un nombre de curso y un autor, inicializa el curso y guárdalo exactamente como el primer plano Entonces en la parte inferior de este archivo, tenemos una llamada a esta función para crear un nuevo curso con este autor. Entonces, antes de ir más lejos, abramos Mongoi B Compass y eliminemos esta Queremos comenzar en un lienzo limpio para asegurarnos de que estamos en la misma página. Todo bien. Hermoso. Ahora en la terminal, vamos a ejecutar node embedding dot js Entonces aquí está nuestro nuevo documento del curso. Se puede ver autor es un objeto con dos propiedades, ID y nombre. Entonces esto es un incrustado o un subdcument. Estas subdcuments son como documentos normales. Por lo que la mayoría de las funciones que están disponibles en documentos normales también están disponibles en subdcument Por ejemplo, podemos implementar la validación aquí. Podemos hacer cumplir eso. El nombre del autor podría ser requerido. No obstante, estos subdocumentos no se pueden guardar por sí solos. Solo se pueden salvar en el contexto de su padre. Entonces digamos que quiero cambiar el nombre de este autor. Aquí está el ID del curso. Vamos a copiar eso. Aquí, voy a crear un nuevo **** divertido. LauncUdate autor Pregunta a Brsdges a Ecodblog. Aquí, primero necesitamos encontrar un curso con una identificación dada. Así que llamamos a cours punto Fine BID, pasar este ID de curso Ahora espera el resultado y consigue este curso abyecto. ¿Bien? Ahora modificamos al autor. Supongamos punto autor el nombre, le dijimos esto a Yvan Rebounci Y ahora podemos llamar force dot C. Así que no tenemos curso autor punto guardar. Eso no existe. ¿Bien? Entonces sigamos adelante y ejecutemos esta función. Autor de actualización, y aquí está mi ID de bolso. Ahora, de vuelta en la terminal, vamos a ejecutar node embedding dot js Nuestro documento está actualizado. Entonces echemos un vistazo a Compass. Refresca esta es nuestra colección de cursos de juegos infantiles. Aquí está nuestro documento del curso, otro objeto, y puede ver las propiedades del nombre actualizadas. También podemos actualizar un subdcument directamente. Entonces, en lugar de quering primero, podemos actualizarlo directamente en la base Entonces aquí, voy a modificar este código y reemplazar bien por ID con actualización uno. Aquí, como primer argumento, pasamos un objeto query. Estamos buscando un curso con este ID, force ID , y el segundo argumento es nuestro objeto de actualización. Entonces aquí usamos un operador set que ya has visto antes. Ponemos esto a un objeto, y aquí pasamos uno o más pares de valores E. Entonces aquí, para acceder a la propiedad anidada, usamos la notación de pensamiento Digamos que queremos actualizar el nombre del autor de un curso. Así pasamos autor nombre punto. Le pusimos esto a Peter Parker. Bien. Con esto, no necesitamos modificar este objeto en memoria y guardarlo explícitamente. Lo actualizamos directamente en la base de datos. Antes de ejecutar este módulo, me doy cuenta de que aquí he cometido un error. Esto debería ser actualizar uno. Todo bien. Vamos a ejecutar esto de nuevo. Bien, vamos a revisar Compass, refrescar aquí. Así que aquí está nuestro objeto autor. Y mira, nombre se actualiza a Io parker. Si desea eliminar un subdcument, utilice el Déjame mostrarte cómo funciona eso. Utilizamos el operador unset. Ahora podemos usar unset author dot name para eliminar esta propiedad anidada O podemos eliminar este sub doocument en su conjunto. Necesitamos establecer esto en una cadena vacía. ¿Bien? Ahora vamos a ejecutar esto de nuevo. Así que los perros de incrustación de nodos vuelven a abarcar, refrescar y mirar, ya no tenemos la propiedad de autor Ahora, como le dije antes, estos subdocumentos son similares a los documentos normales. Entonces aquí podemos hacer cumplir la validación. Podemos hacer cumplir eso. Cada curso debe tener un autor. Pero aquí está la definición de nuestro esquema de curso. Si desea que esta propiedad de autor sea requerida, aquí necesitamos pasar un objeto de tipo esquema. Entonces establecemos el tipo a esquema de autor y luego requerimos que sea verdadero exactamente como lo que hemos aprendido anteriormente en esta sección. O si quieres hacer una propiedad específica en este autorbdcument requerido, aplicas esa validación sobre el subdcument de autores en sí mismo Así que aquí se pasa un objeto de tipo de esquema y se establece la propiedad requerida en true. En la próxima conferencia, te voy a mostrar cómo trabajar con una serie de subdcuments 6. Matrices de subdocumentos en Mongoose: Entonces en la última conferencia, agregamos autor como subdocumento en este documento del curso. En esta conferencia, voy a mostrarles cómo cambiar esto a una serie de subdocumentos. Entonces primero, cambiamos el nombre de esta propiedad a autores y luego cambiamos su valor a un esquema de matriz de autores. Bien. Ahora aquí, a la hora de crear un curso, también queremos pasar una serie de autores. Entonces voy a renombrar este parámetro a autores. Bien. Y finalmente, aquí es donde estamos creando un curso. Entonces, en lugar de pasar un objeto author, pasamos una matriz. Aquí está el primer autor, y aquí el segundo. Digamos comedorero. Ahora, de vuelta en brújula, voy a eliminar esta colección, así vemos todos los nuevos datos sin ninguna confusión, ¿de acuerdo? Ahora de vuelta en el nodo terminal incrustando punto Gs. Bien, aquí está nuestro nuevo documento del curso. Se puede ver autores se establece en una matriz con dos objetos. Este es el primer autor y aquí el segundo autor. Y si miras en Compass, vamos a refrescarnos aquí. Esta es la colección del curso. Aquí está nuestro documento cruzado con una variedad de autores. Hermoso. Todo autor es un objeto. Cuando expandes eso, ves dos propiedades ID y nombre. Hermoso. Ahora siempre podemos agregar un autor a esta matriz más adelante. Déjame mostrarte. Así que de vuelta en el código, vamos a crear una nueva función, constante agregar autor Asincrónico Entonces pasamos un ID de curso aquí y un objeto de autor. Ahora aquí necesitamos encontrar una pose primero. Fuerza tan constante. Establecemos esto para esperar a ForstFineBy ID. Y aquí pasamos este argumento de ID de curso . Tenemos el curso. Ahora, los autores de la fuerza, como saben, es una matriz. Así podemos llamar al método push para empujar este objeto author en esta matriz. Pero nuestros cambios sólo están en la memoria. No se guardan en la base de datos, así que tenemos que llamar a force.ca Ahora déjame eliminar esto y llamar a agregar autor. Ahora déjame eliminar esto y llamar a agregar autor Aquí, tenemos que aprobar el ID del curso. Así que voy a volver englobar y copiar esta identificación del curso. Así que pegarlo aquí y luego pasar un nuevo objeto autor con el nombre, digamos, flash. De vuelta a la terminal, volvamos a ejecutar esto. Bien, nuestros cambios se guardan en la base de datos. Entonces vamos a verificarlos. Voy a refrescarme aquí. Aquí están los autores. Mira, tenemos tres objetos en esta matriz. Y aquí está nuestro nuevo autor. Quitar a un autor es muy similar. Así que de vuelta en el código, vamos a añadir una nueva función, constante eliminar autor. Asincrónico aquí necesitamos dos parámetros, monedero e ID de autor Entonces primero, cargamos el curso igual que antes. Ahora vamos a cours dot autores. Aquí tenemos un método llamado ID, y con eso, podemos buscar un objeto hijo por su ID. Entonces pasas este ID de autor que nos da el objeto autor. Ahora podemos llamar al método Delete one sobre este objeto. Y por último, guarda el rumbo. Bien, así que vamos a llamar a esta nueva función, eliminar autor. Permítanme duplicar esta línea, eliminar el segundo argumento y cambiar el nombre para eliminar autor. Ahora necesitamos una identificación de autor. Así que atrás engloban, Aquí está la idea de flash. Entonces voy a pegar eso aquí. Bien, vamos a ejecutar esto. Nodo, incrustación de punto js. Hermoso. Echemos un vistazo a nuestros datos. Entonces voy a refrescar esta página. Autores, miren, ahora solo tenemos dos autores. Flash se ha ido. Entonces así es como trabajamos con subdcuments 7. Configurar MongoDB para transacciones: Bienvenido de nuevo. En este video, estamos configurando conjuntos MangaiBrplica, que son esenciales para ejecutar transacciones Esta configuración asegurará que Mangaib esté en modo de conjunto de réplicas, lo que le permitirá trabajar con transacciones de múltiples documentos En la próxima conferencia, nos sumergiremos en realizar transacciones usando mangosta Entonces, sentemos las bases hoy. Entonces repasaremos dos opciones. número uno es una réplica de un solo nodo establecida en el servidor Mangaib local Ahora bien, este enfoque es excelente para las pruebas y el desarrollo. Y el número dos son los conjuntos de réplicas con Mangaib atlas, cual es ideal para la producción ya que está basado en la nube y totalmente administrado Empecemos con la configuración local. Por lo que configuraremos Monger I B para que se ejecute en modo conjunto de réplicas en su máquina local con un solo nodo Esta configuración nos permite desarrollar y probar transacciones a nivel local. Entonces necesitamos configurar el modo de conjunto Manga IB o Réplica, y para ello, necesitamos editar la configuración de Mongo DB Localice el archivo de configuración. Por defecto, este archivo se encuentra en los archivos del programa de viaje, servidor Mongo DB Después la carpeta Virgin, que es 8.0 en mi caso, y después la carpeta bin, y aquí está mongod dot conf Ahora abre mongod dot cfg con un editor de texto como bloc de notas o código de Visual Studio y localiza o agrega sección de replicación Aquí está replicación RUPL ese nombre. Ponemos esto a RS Zero. Y ahorra. Es posible que obtenga un error porque no está en modo administrador. Entonces aquí hay un prompt. Solo inténtalo como administrador y nuestro archivo se guarda. Puede usar cualquier nombre para el conjunto de réplicas, pero R cero es una opción común. Ahora, reiniciaremos Mongo DB con la configuración actualizada Así que abre Power Shell como administrador y ejecuta el servicio lap, ah, A Mongo DB. Ahora lo reiniciaremos. Así que inicia el servicio, h A Mongo DB. Con Mongo I B ahora en modo set réplica, lo inicializaremos Para eso, necesitamos instalar Mongo DB shell. Por lo que Mongo B 6.0 y versiones posteriores proporcionan Mongo Asch como un Ya no se incluye con la instalación del servidor Mongo ib Si ya lo tienes instalado, eso es bueno. Si no, entonces visita la página de descargas de Mongo Debe Shell. Seleccione su sistema operativo para descargar la última versión. Preferiría el instalador de MS para una instalación más limpia. Aunque depende de tu elección, también puedes elegir ZIP. Abra el MSI e instálelo. Haga clic en Siguiente y tenga en cuenta que tiene que copiar la ruta de instalación. Así que cópielo a continuación e instálelo. Una vez instalado, agregue el directorio Mongash a la ruta del sistema. Así que vamos a abrir las variables de entorno. Hay que buscar variables de entorno del sistema. Aquí, haga clic en variables de entorno. En la sección de variables de sistema, como ruta y haga clic en Editar. Agrega la ruta que copiaste y haz clic en Ok para guardar los cambios. Entonces una vez más. Bien. Bien. Genial. Ahora reiniciaremos PowerShell para aplicar cambios. Después de agregar Mongo SH a la ruta, vaya al PowerShell y ejecute Mongo Por defecto, Mongo SH se conecta al puerto host local 27017. Si su servidor Mongo DV se ejecuta localmente en el puerto predeterminado, se conectará automáticamente Ahora, inicializa el conjunto de réplicas ingresando punto Rs, inicia Estoy recibiendo este mensaje de error porque ya he iniciado el conjunto de réplicas antes. Para que puedas ignorarlo. Recibirás el mensaje correcto. Finalmente, verificaremos el estado y nos aseguraremos de que el conjunto de réplicas se esté ejecutando. Entonces Rs punto estado. Hermoso. Todo está configurado correctamente, y MongoDB ahora se ejecutará en modo de conjunto de réplicas, y estamos listos para comenzar a trabajar con transacciones localmente Pero esto no es entonces. Para entornos de producción, MongoDB Atlas es una opción increíble porque configura automáticamente conjuntos de réplicas multinodo, lo que significa que el soporte de transacciones está listo para comenzar de inmediato Entonces, antes que nada, dirígete al sitio web de MongoDB Atlas Si aún no tienes una cuenta, regístrate, es rápido y gratis. Si ya tienes uno, solo tienes que iniciar sesión. Una vez que haya iniciado sesión, haga clic en Nuevo proyecto en el panel de Atlas. Ahora nombra el proyecto. Voy a elegir Ruedas Justas a Llantas justas y luego dar clic en siguiente. Aquí, crea el proyecto. Entonces se crea nuestro proyecto. Tenemos que crear un cluster. Así que haz clic en Crear entonces aquí, si estás probando cosas, el nivel cero gratuito es perfecto. Pero para la producción, querrás elegir un nivel superior para obtener más potencia y características. Una vez hecho esto, nombra tu clúster. Entonces el valor predeterminado es cluster cero, pero voy a elegir par de ruedas. Ahora, elija un proveedor de Cloud, AWS, Azure o Google Cloud y seleccione la región más cercana a un usuario. Esto ayuda a reducir la latencia y mejora el rendimiento. Voy a elegir AWS y región como Mumbai y luego crear implementación. Y aquí se crea nuestro cluster. Entonces aquí tenemos que crear un nombre de usuario y contraseña, que vamos a utilizar en nuestra cadena de conexión para asegurarnos de que copia la contraseña y el nombre de usuario. Y luego crear usuario de base de datos. A continuación, hay que elegir un método de conexión. Entonces, aquí elige conductores. Asegúrese de que el conductor esté cerca de Js. La versión es 6.7 o posterior. Y como pueden ver, llantas justas es aprovisionamiento. Por lo que nuestra base de datos es aprovisionamiento y tardará algún tiempo. Mientras tanto, aseguremos nuestra cadena de conexión. Vaya a Acceso a la red y agregue su dirección IP. Esto permite que tu app se conecte al clúster. Si estás en una IP dinámica, puedes agregar un amplio rango o permitir el acceso desde cualquier lugar, pero ten cuidado con esto en la producción. No, eso es. Vuelvo a los clusters. Tomará unos minutos. Voy a adelantar rápido, y aquí está. Así que haz clic en Conectar, y luego otra vez, conductores, asegúrate de que cerca de Jasn 617 o posterior esté seleccionado Y aquí está nuestra cadena de conexión. Se verá algo así. Manga V plus SRE Colen SLAlsh y el nombre de usuario y la contraseña Entonces esta no es tu contraseña. Debe asegurarse de reemplazar DVPassword con una contraseña para su nombre de usuario Copia esta cadena y reemplaza la cadena de conexión en nuestra aplicación con esta. Así que asegúrate de nombrar la base de datos después de la red de dardos, slash fair wheels Esto asegurará que su base de datos esté conectada, o si no hay una base de datos de ruedas justas nombradas, entonces se creará. También asegúrate de reemplazar la contraseña de DB una contraseña que copiaste que generaste aleatoriamente, y eso es todo. Con el atlas de Mongerib, los conjuntos de réplicas están habilitados por defecto. Por lo que un clúster está listo para manejar transacciones sin ningún paso adicional. Es así de simple. En la próxima conferencia, vamos a construir sobre esta configuración sumergiéndonos en las transacciones usando mangosta 8. Realiza transacciones con Mongoose: En Mon Vov, tenemos el concepto de transacciones, que básicamente significa un grupo de operaciones que deben realizarse como una unidad Entonces o todas estas operaciones completarán o cambiarán el estado de la base de datos, o si algo falla en el medio, todas estas operaciones que se han aplicado serán revertidas, y nuestros datos, esto volverá al estado inicial. Las transacciones de MovaDB están realmente más allá del alcance de este curso Pero si quieres saber más sobre ello, déjame mostrarte la página correcta en la documentación. Así que busca transacciones Mongo DB. Bien, entonces aquí transacciones Mongo DB manual. Este documento explica claramente cómo realizar transacciones distribuidas usando un ejemplo real salvaje. Ahora bien, en esta conferencia, voy a mostrarles transacciones usando mangosta Pero internamente, implementa esta transacción utilizando las transacciones mongoiw Ahora de vuelta en el código aquí en alquileres punto js en la parte superior, primero, necesitamos cargar Mangoose Tan constante mangosta. Establecimos esto para que requiera Mangosta. Ahora, tiene un método de inicio de sesión al que necesitamos llamar aquí mismo. Así que espera Mongos punto inicio sesión y guárdala en sesión Entonces sesión de pons. En nuestro método post, aquí es donde creamos un objeto de alquiler. Ahora ya no vamos a crear este alquiler y actualizar lo explícito. En cambio, vamos a iniciar una transacción. Aquí, iniciamos una transacción llamando a session dot start transactions. Todas las consultas de mangos relacionadas con la transacción hacen pausa una opción de sesión para asociarlas con la transacción Entonces aquí tenemos dos operaciones mongoi. Renta dot save y auto dot CV. Entonces quieres guardar este nuevo alquiler colección de rentas. Entonces llamas a guardar y aprobar la sesión. Bien, entonces esta es nuestra primera operación, ahorrando el nuevo alquiler. Ahora, como parte de esta unidad, también queremos actualizar la colección del auto. Por lo que pasamos sesión aquí y abatir esta operación también. Entonces estas son dos operaciones. Después de encadenar todas estas operaciones, y finalmente, necesitas llamar a esperar sesión punto Comtransactions Y sesión de punto de sesión. Si no codifica la transacción de confirmaciones, ninguna de estas operaciones se realizará. Todo bien. Ahora es posible que algo falle durante esta transacción. Así que tenemos que envolver esto en un bloque try cache. Entonces aquí voy a agregar un bloque trib. Voy a mover todo este código dentro del bloque tri. Entonces esto es para nuestro escenario de éxito. Ahora bien, si algo falla, deberíamos coger una excepción aquí y devolver un error 500 con el clin Entonces respuesta punto estado 500, lo que significa error interno del servidor con un mensaje mentira, su vehículo no está molestado Algo salió mal. Pero antes de esto, tenemos que abortar la transacción Así que espera la sesión punto a bordo la transacción y luego sesión de punto de sesión. Ahora en una aplicación del mundo real, en este punto, desea registrar esta excepción. Para que después puedas volver y ver qué salió mal. Vamos a tener una sección separada en el curso sobre manejo de errores y registro. Entonces, por ahora, no nos preocupemos por esto. Así que de vuelta en Mongo DB Campus, voy a eliminar los alquileres de colección rentas Ahora de vuelta en la terminal, t's ejecuta la aplicación. No más. Nuestra aplicación se está ejecutando. Hermoso. De vuelta en nuestra base de datos, mira nuestra colección de autos. Entonces aquí tenemos un auto y un número en stock es cinco. Voy a crear un nuevo alquiler. Entonces vamos a volver aquí, y este número debería ser f. Así que volvamos a Cartero Entonces voy a enviar una solicitud de correo a nuestro punto final de alquileres, y aquí en el cuerpo de la solicitud, tengo una identificación de cliente válida y una identificación de auto. Entonces, vamos a enviarnos. Bien, aquí está nuestra respuesta. Hermoso. Entonces este es nuestro nuevo objeto de inquilino. Puedes ver que lo rentas en DNI, cliente y auto. Ahora de vuelta en la base de datos aquí en la colección del auto, voy a refrescar esta lista. Mira, el número en la acción es ahora cuatro. Por lo que esto verifica que nuestra transacción se completó con éxito Ahora tengo una pregunta para ti. Así que aquí creamos este objeto de alquiler. Solo fijamos cliente y auto. Después pasamos la sesión a los Mongo Di Boperations y enviamos este objeto de alquiler al cliente Entonces en este código, no pusimos la identificación ni la alquilamos en propiedades. Pero en el cuerpo de la respuesta, se puede ver que ambas propiedades están establecidas. Entonces, ¿cómo sucedió esto? En ninguna parte de este código después de que ejecutamos esta transacción, restablecemos el objeto de alquiler. Entonces, ¿cómo obtuvimos la identificación y la fecha de las propiedades? Quizás esperas que Mongo DB establezca estos valores para nosotros. Pero en realidad, no. En Mongo B, no tenemos estos valores predeterminados Los definimos en nuestro esquema de Mangosta. Entonces, cuando creamos una nueva renta u objeto, Mongoose conoce el esquema para este objeto Analiza varias propiedades y establece los valores predeterminados. Lo mismo es cierto para la propiedad IE. Entonces, con mayor precisión, Mongo DB no establece esto. Esta propiedad se establece antes de guardar este documento en la base de datos. No te lo dije antes porque no quería confundirte con demasiados detalles Hay más a ID que vamos a cubrir en la próxima conferencia. 9. ObjectID en MongoDB: En esta conferencia, vamos a ver ID de objeto en Mongo Di Bi Entonces has notado que cuando almacenas un documento en Mongadib, Mongo Debi establece el valor de la propiedad ID en una Entonces aquí tenemos 24 caracteres, y cada dos caracteres representan un byte. Entonces, esencialmente, tenemos 12 bytes para identificar de manera única un documento en Mongo Deb Ahora de estos 12 bytes, los primeros cuatro bytes representan una marca de tiempo, y ese es el momento en que se creó este documento Posteriormente, te voy a mostrar cómo extraer esta marca de tiempo de este ID de objeto Entonces con estos cuatro bytes, no es necesario crear una propiedad separada en su documento como se creó en, porque esta marca de tiempo está incluida en el ID del objeto De la misma manera, si quieres ordenar tus documentos en función de su tiempo de creación, simplemente puedes ordenarlos por su propiedad ID. Los siguientes tres bytes representan un identificador de máquina. Por lo que dos máquinas diferentes tendrán dos identificadores diferentes. Los dos bytes siguientes representan un identificador de proceso. Entonces, si generamos dos ID de objeto en la misma máquina, pero en diferentes procesos, estos dos bytes serán diferentes. Y por último, los tres últimos bytes representan un contador. Si estás en la misma máquina en el mismo proceso en el mismo segundo, pero generas dos documentos diferentes, el galope Bites será diferente Así que con estos 12 bytes, podemos identificar de manera única un documento en Mongadib Hay una probabilidad muy, muy, muy baja de que generemos dos ID de objeto que sean iguales. Déjame mostrarte cómo puede suceder eso. Entonces ya sabes que en un byte, tenemos ocho bits. En cada bit, tenemos o bien un cero o uno. Entonces, ¿cuántos números podemos representar en un byte u ocho bits? Bueno, eso es dos a la potencia de ocho, que es 256. Entonces con un byte, podemos almacenar 256 números diferentes. Ahora ya les dije que los últimos tres bytes representan un contador. Esto es como el contador que probablemente hayas visto en el servidor SQL, MySQL y otras bases de datos. Entonces un número auto incrementando como uno, dos, tres, cuatro, y así sucesivamente Entonces, ¿cuántos números puedes almacenar en tres bytes? Eso es dos al poder de 24. Eso es 16 millones. Entonces si al mismo segundo en la misma máquina en el mismo proceso, generamos más de 16 millones de documentos, este contador se desbordará. Y ahí es donde podemos terminar con dos documentos con el mismo ID de objeto. Pero se puede ver que este es un escenario muy poco probable para la mayoría de las aplicaciones que existen. Todo lo que quiero que sepas es que este ID de objeto es casi único, pero no al 100%. Ahora, puede que tengas curiosidad por qué no tenemos un mecanismo en Mongo Dew que garantice la singularidad Por ejemplo, en sistemas de gestión de bases como SQL server o MySQL, en la tabla E, tenemos un número de auto incrementamiento que garantiza la singularidad La próxima vez que queramos almacenar un registro de curso en nuestra base de datos, la idea de ese curso será la idea del último curso más uno. Este enfoque garantiza la singularidad de estos identificadores, pero perjudica la escalabilidad en Este ID que tenemos aquí no es generado por el propio Mongo DB En realidad es generado por el conductor Mongo DB. Entonces tenemos a este conductor de Mongo Dew que habla con Mongo Div. Entonces este ID aquí es generado por el conductor, y eso significa que no tenemos que esperar a Mongo Dew genere un nuevo identificador único Y es por eso que las aplicaciones construidas sobre Mongo DB son altamente escalables Podemos tener varias instancias de Mongo DB y no tenemos que hablar con un lugar central para obtener un identificador único El propio controlador puede generar un identificador casi único utilizando estos 12 bytes. Entonces, cuando construimos una aplicación con Node y Express, usamos mangosta Como te dije antes, mangosta es una abstracción sobre Mongo DB driver Entonces, cuando creamos un nuevo ID de objeto y un nuevo documento, Mongoose habla con el controlador Mongo DB para generar un nuevo Ahora, también puedes generar explícitamente un ID si quieres. Déjame mostrarte. Voy a aclarar todo esto en la parte superior. Carguemos Mongos requieren mangos. Aquí podemos crear un nuevo ID de objeto. Así que vamos a establecer esto a nuevos tipos de puntos Mongos dot Object IDE. Y luego vamos a registrar esto en la consola. Y aquí en terminal, vamos a ejecutar este programa que es nodo objeto ID punto js. Así que mira, tenemos un identificador único, y no almacenamos nada en Mongoib Generamos este ID de objeto en la memoria. Ahora te dije que los primeros cuatro bytes representan una marca de tiempo Entonces este ID de objeto tiene un método llamado GTs Stamp, guardar de nuevo en terminal Vamos a ejecutar esto de nuevo. Mira, este es el momento en que generé este ID de objeto. También tenemos un método estático en esta clase de ID de objeto para validar los ID de objeto Entonces mangos tipos de punto punto Id. de objeto punto es válido. Así puedo pasar una cuerda aquí, 12, tres, cuatro. Obviamente, este no es un ID de objeto válido. Entonces, cuando loguemos esto en la consola, deberíamos obtener false. El registro de puntos de la consola es válido. Vamos a ejecutar esto de nuevo. Y aquí está el resultado. Entonces ahora que entiendes los ID de objeto con más detalle, en la próxima conferencia, vamos a volver a nuestra aplicación Fair Wheels y hacer algunos cambios para mejorar nuestra aplicación. 10. Validación de ObjectID con Joi: Así que de vuelta en nuestra aplicación Fair Wheels, tengo cartero abierto, y voy a enviar una solicitud de correo a nuestro punto final de alquileres Y aquí en el cuerpo de la solicitud, tenemos una identificación de cliente válida y una identificación de automóvil. Ahora, déjame mostrarte lo que sucede si cambiamos este ID de objeto a un valor como 1234. Entonces este no es un ID de objeto válido. Enviemos esta solicitud. Se puede ver que tenemos el estado 500, que es error interno del servidor. Sin embargo, este no es el caso, ya que hemos enviado una identificación de cliente inválida. Como les dije antes, tenemos una sección separada sobre manejo de errores y registro en el curso. Entonces, no nos preocupemos por esta parte. Por ahora, vamos a registrar este error en la consola para ver qué pasó ahí exactamente. Así que de vuelta en el código aquí en el bloque de caché, consola dot log per vamos a enviar de nuevo la solicitud. Ahora, si miras en el terminal, convertir al campo ID de objeto para el valor uno, dos, tres, cuatro, escriba cadena en ID de subrayado de ruta para cliente modelo Este mensaje puede sonar un poco demasiado técnico o confuso, pero te lo voy a hacer muy sencillo. Entonces aquí estamos hablando este modelo cliente o clase de cliente. Estamos hablando de la propiedad de identificación. En Mangosta, se ve la palabra camino porque camino puede representar una cadena de propiedades Por ejemplo, un cliente puede tener dirección, y la dirección puede tener calle. Entonces por eso usamos caminos. Ahora aquí, Mangus se queja de que no pudo lanzar el valor 1234 al ID del objeto Obviamente, porque 1234 no es un ID de objeto válido. Pero el tema que tenemos en nuestra implementación es que, antes que nada, estamos obteniendo una respuesta genérica aquí, y estamos obteniendo este error en terminal. En esta situación, cuando enviamos un ID de cliente no válido, deberíamos obtener un error 400. Esa es una mala solicitud porque un servidor no puede cumplir con esta solicitud. Así que de vuelta en RentoStgs este es el manejador para crear un En la parte superior, estamos validando la solicitud, y esto asegura que en nuestra solicitud, tengamos una identificación de cliente y una identificación de automóvil Pero no le importa si estos valores son identificadores de objeto válidos. Esa excepción fue arrojada en esta línea en la línea 21. Cuando intentamos encontrar un cliente por ID, si pasas un ID de objeto no válido, es entonces cuando obtenemos esa excepción. Entonces, una forma de solucionar este problema es así. Si los tipos de puntos Mangus hacen ID de objeto que es válido. Por lo que pasamos solicitud body dot ID de cliente. Ahora bien, si esto no es válido, vamos a devolver el error 400. Entonces estado 400 con un mensaje como cliente inválido. Y luego tenemos que repetir lo mismo para validar la propiedad de identificación del auto No obstante, esta es una mala implementación. Este es un mal enfoque para resolver este problema porque antes, definimos esta función para validar nuestra solicitud. Entonces esta lógica realmente pertenece a esta función. Entonces en esta función, queremos asegurarnos de que el ID de cliente sea una cadena. Tiene un valor y es un ID de objeto válido. Entonces, si la entrada está en la forma correcta, entonces vamos a la base de datos para encontrar a ese cliente. ¿Bien? Entonces voy a borrar estas dos líneas de aquí. Volvamos a nuestra función de validación. Entonces eso es en renta punto JS. Aquí está nuestra función de validación de alquiler. Ahora aquí necesitamos agregar validación personalizada porque necesitamos hablar con mangosta Tenemos que llamar es método válido de tipo de ID de objeto. Ahora bien, extender esta validación es un poco complejo, y no querrás repetirlo cada vez que tengas una función de validación. En realidad, hay un paquete NPM para agregar soporte para validar ID de objeto, disfrute Así que de vuelta en la terminal, instalemos Joy Object ID. Entonces no eso, la versión actual que estoy usando es la versión 4.0 0.2. Ahora, de vuelta en el código aquí en alquiler punto Gs, en la parte superior, necesitamos cargar este módulo. Por lo tanto requieren Joy Object ID. Ahora bien, esto devuelve una función. Tenemos que llamar a esta función y pasar una referencia a este módulo Joy. Entonces pasamos a Joy aquí, y por cierto, no tienes que memorizar esto Simplemente puede mirar la documentación de NPM. Otro resultado de esto es una función, por lo que podemos establecer joy dot Object ID a esta función. Entonces Object ID es un método en este objeto Joy. Ahora, volvamos a nuestra función de validación, así que aquí, voy a cambiar la definición de este ID de cliente cadena de punto de alegría a ID de objeto de punto de alegría. Ese es el método que definimos en la parte superior de este módulo, ¿verdad? Y también se requiere. Vamos a hacer el mismo cambio para la propiedad de identificación del auto. Así ID de objeto. Ahora, de vuelta a la terminal, volvamos a ejecutar la aplicación. Voy a enviar una solicitud con esta identificación de cliente inválida. Mismo. Bien, mira, tenemos un mal pedido. El ID de cliente con valor 1234 no coincide con el patrón requerido. Y si miras en el terminal, C, ya no conseguimos ese cast to object ID failed error. Ahora, hay una implementación mucho mejor para este enfoque. Así que de vuelta en el punto JS de alquiler, es probable que vamos a utilizar este método en otros lugares de nuestra aplicación, como en el módulo de autos o en el módulo de cliente. No queremos redefinir este método de ID de objeto en cada módulo Entonces en la parte superior del archivo, aquí es donde definimos el método de ID de objeto en el objeto joy. Voy a mover esto de aquí al punto índice Gs. Así que lo cargamos una vez y podemos reutilizarlo en todas partes en nuestra aplicación. Entonces, consigamos esto y vayamos al punto índice JS. En la parte superior, agreguemos esta línea aquí. También debemos cargar alegría. Alegría tan constante. Ponemos esto para que requiera alegría. ¿Bien? Entonces esa es una mejor implementación. Hay un lugar más que necesitamos modificar aquí. Entonces en nuestra carpeta de modelos, mira car dot js. Entonces, al crear un automóvil, necesitamos pasar una identificación de empresa válida. Entonces voy a reemplazar esto con joy dot object ID. Ahora, un último cambio antes de que terminemos esta conferencia. Entonces, en nuestra carpeta de rutas, echemos un vistazo a los autos dot JS. Aquí está el manejador para crear un auto nuevo. Entonces aquí creamos un nuevo objeto auto, lo guardamos en la base de datos, y luego lo devolvemos. Ahora bien, en esta implementación, estoy reiniciando este auto luego de guardarlo en la base de Esto fue puramente para demostrar que este método de guardar devuelve un documento de automóvil. Y además, no quería distraerte con demasiados detalles sobre cómo funcionan los ID de objeto Entonces, ahora que ya sabe, los ID de objeto en realidad son generados por el controlador MongoDB, no por la base de datos Mongo Sabes que cuando creamos un nuevo objeto de auto, Mongoose habla con el conductor de MongoDB y establece la identificación aquí mismo antes de guardar este auto Entonces, técnicamente, no necesitamos reiniciar este auto para poder devolver esa identificación al cliente. podamos eliminar eso y cambiar la tarjeta de una variable a una constante. El mismo principio se aplica a la hora crear un nuevo cliente y una nueva empresa.