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.