‫Ponente: Sigamos ahora trabajando en nuestra API.
‫En los próximos videos, implementaremos
‫un par de características de API comunes
‫que hacen que una API sea más fácil y agradable de
‫usar para quien la vaya a utilizar.
‫Y en
‫esta conferencia, comenzaremos con el filtrado.
‫Entonces, nuevamente, la primera característica que implementaremos es permitir
‫que el usuario básicamente filtre datos usando una
‫cadena de consulta.
‫Permítanme decirles qué cadena de consulta usa Postman.
‫Entonces, cerremos a todos estos chicos.
‫Bien.
‫En realidad, donde el filtrado tendrá sentido es aquí
‫en esta ruta para obtener todos los recorridos.
‫Porque, este es el que, como
‫bien dice el nombre, se lleva todos los tours.
‫Y aquí queremos permitir que el usuario filtre los datos, de modo
‫que en lugar de obtener todos los
‫datos, solo obtenga los datos que coincidan con el filtro.
‫Así, básicamente podemos permitir que el usuario consulte los
‫datos de una manera muy sencilla.
‫Nuevamente, usando la cadena de consulta.
‫Y la cadena de consulta se parece un poco a esto.
‫Y estoy seguro de que lo has visto.
‫Entonces, comenzamos con un signo de interrogación
‫y luego simplemente podemos especificar algunos pares de valores de campo.
‫Entonces, digamos que
‫queríamos filtrar por una duración igual a cinco
‫y, al mismo tiempo, una dificultad fácil.
‫Entonces, podemos simplemente construir una cadena de consulta como esta.
‫Entonces, nuevamente, comienza con este signo
‫de interrogación, y luego
‫podemos especificar tantos pares clave-valor usando este formato.
‫Y ahora nuestra aplicación
‫Postman reconoce esto y básicamente analiza
‫esta cadena aquí y coloca la clave
‫y los valores aquí en esta pestaña de Parámetros.
‫Entonces también podríamos especificar la clave y los valores aquí.
‫Entonces, digamos prueba, configúrelo en veintitrés, y verá aquí
‫que realmente lo agregó
‫a la cadena de consulta.
‫Así que esa es una forma muy agradable de que Postman nos ayude aquí.
‫Porque ahora podemos, por ejemplo, mientras hacemos
‫las pruebas, podemos activarlos y desactivarlos y verá que
‫la cadena de
‫consulta aquí reacciona en consecuencia.
‫De todos modos, ahora necesitamos una forma de acceder a estos datos que están
‫en una cadena de consulta, en nuestra aplicación Express.
‫Pero, afortunadamente para nosotros, eso es
‫muy fácil, porque Express ya se encargó de eso.
‫Así que esa es solo una de
‫las muchas cosas que Express hace por nosotros para que el desarrollo
‫de NodeJS sea mucho más rápido.
‫Déjame mostrártelo aquí, de hecho en la consola.
‫Entonces, estos datos están en una solicitud, lo que tiene sentido,
‫y luego están en un campo llamado consulta.
‫Por lo tanto, la consulta de puntos de solicitud debería
‫proporcionarnos un objeto con un formato agradable con los datos de la
‫cadena de consulta.
‫Dale una oportunidad.
‫Y tenga en cuenta cómo
‫lo agregué a la función de controlador get all tours.
‫Entonces, nuevamente, hacemos este tipo de filtrado en la
‫ruta donde queremos obtener todos los recorridos.
‫Probemos ahora con esta cadena de consulta exacta.
‫Envió la solicitud.
‫Y volviendo, aquí tenemos el objeto.
‫De hecho, hagamos esto aquí más grande para
‫que pueda ver.
‫Eso no está funcionando realmente.
‫Entonces, a veces sé que algunas personas no pueden
‫ver la parte inferior de la pantalla.
‫Déjame hacerlo de nuevo aquí.
‫Y así, aquí vamos.
‫Tenemos el objeto, que tiene la duración establecida en cinco
‫y la dificultad establecida en fácil.
‫Y entonces ve que Express,
‫muy bien, analizó esa cadena en este objeto fácil de usar.
‫Ahora, una cosa que noté aquí es que
‫en realidad nos falta el registro
‫que teníamos más fácilmente aquí en la consola.
‫Echemos un vistazo a por qué está sucediendo eso.
‫Entonces, por alguna razón, ahora tenemos la aplicación
‫antes de leer la variable de entorno.
‫De esa forma, la aplicación no tiene acceso a ellos.
‫Pensé que lo había arreglado antes, pero por alguna
‫razón está de vuelta ahora.
‫Dale otro guardado aquí.
‫Y lo intentaré de nuevo.
‫Ahora recuperamos nuestro registro.
‫Una solicitud de obtención a esta URL y luego con
‫el resto de los datos aquí.
‫De todos modos, ahora usemos
‫esos datos para implementar nuestro filtrado.
‫Pero antes de que podamos hacer eso, necesito decirles que
‫en Mongoose, en realidad hay dos formas de escribir
‫consultas de bases de datos.
‫El primero es usar el objeto de filtro
‫tal como lo hicimos en la sección de introducción de MongoDB.
‫¿Derecha? ¿Recuérdalo?
‫La segunda forma es utilizar algunos métodos especiales de Mongoose.
‫Permítanme, muy rápidamente, mostrarles eso.
‫Con el objeto de filtro, lo haríamos así.
‫Comenzamos con el hallazgo aquí, y luego allí podemos
‫pasar un objeto de filtro.
‫Y eso ya lo mencioné antes.
‫Nuevamente, funciona exactamente de la misma manera que
‫con una consulta normal de MongoDB.
‫Ahora podríamos decir que la duración lo
‫estableció en cinco.
‫Y
‫luego, dificultad, ponlo fácil.
‫Esa es exactamente la cadena de consulta que teníamos antes,
‫y ahora la estoy codificando aquí
‫solo para mostrarte las dos formas diferentes
‫de escribir consultas en Mongoose.
‫Probemos este.
‫Ves que ahora, solo obtenemos dos resultados.
‫Démosnos un poco de espacio aquí.
‫Bien.
‫Vemos los dos resultados y, de hecho,
‫ambos tienen una duración
‫de cinco, así que aquí y aquí, y ambos son fáciles.
‫Fácil y sencillo.
‫Entonces nuestro filtro funcionó bien.
‫Esa es la primera forma de escribir una consulta.
‫Solo de la forma normal a la que ya estamos acostumbrados,
‫pero hay otra forma.
‫Déjame mostrarte eso también.
‫Nuevamente, comenzamos exactamente de la misma manera,
‫pero luego la diferencia es
‫que comenzamos a encadenar algún método especial de
‫Mongoose para básicamente construir la consulta similar a esta que tenemos.
‫Así decimos,
‫donde
‫la duración
‫es igual a cinco.
‫Entonces también, donde la
‫dificultad, que debe
‫estar entre comillas, es
‫igual a
‫fácil.
‫Esta consulta aquí será exactamente la
‫misma que esta, pero nuevamente, escrita usando
‫métodos especiales de Mongoose.
‫Y, por supuesto, hay muchos otros métodos.
‫Por ejemplo, en lugar de iguales, podemos tener menos que, o
‫igual, o solo menos que, o también puede ordenar
‫los resultados o limitar el número de resultados, y realmente
‫todo tipo de cosas.
‫Seguro, usaremos algunos de ellos en
‫los próximos dos videos.
‫Esto puede parecerle un poco extraño aquí,
‫pero en realidad es muy, muy útil en algunos casos.
‫Solo para probar, inténtalo de nuevo con este.
‫Y de hecho obtenemos nuestros mismos dos resultados.
‫Ahora, déjame comentar este aquí.
‫Lo dejaré aquí solo como
‫referencia, porque ahora mismo, usaremos este método aquí.
‫Y lo usaremos, porque de hecho,
‫ya tenemos un objeto que se parece
‫mucho a esto.
‫Y esa es la consulta de puntos de solicitud.
‫Si lo comparas, este objeto, con
‫este objeto que ves aquí abajo, se
‫ve exactamente igual que este.
‫Para implementar un filtro muy
‫simple, todo lo que tenemos que hacer en este caso es decir, req dot query.
‫Intentémoslo una vez más.
‫Deshazte de esto aquí.
‫Y de hecho obtenemos exactamente los mismos dos resultados.
‫Ahora intentemos solo con la dificultad configurada como fácil.
‫Ahora obtenemos cuatro resultados.
‫Todos ellos, por supuesto,
‫tendrán la dificultad establecida en fácil.
‫Nuestro filtro, nuestro filtro muy básico,
‫ahora está funcionando.
‫Ahora, el problema con esta
‫implementación es que en realidad es demasiado simple.
‫Eso es porque, más adelante, tendremos
‫otros parámetros de consulta.
‫Por ejemplo, ordenar, para ordenar la funcionalidad, o
‫página, para la paginación.
‫Necesitamos asegurarnos de que
‫no los estamos consultando en nuestra base de datos.
‫Por ejemplo, si
‫agregamos aquí, página, igual a dos,
‫entonces, por supuesto, no obtendríamos ningún resultado.
‫Déjame mostrarte eso.
‫Y, de hecho, no obtenemos ningún
‫resultado, porque no hay ningún documento en esta
‫colección donde la página esté establecida en dos.
‫Solo queremos usar este parámetro aquí, o este
‫campo, página, para implementar la paginación y no para
‫realizar consultas en la base de datos.
‫Entonces, lo que tendremos
‫que hacer es, básicamente, excluir estos nombres de campos especiales de
‫nuestra cadena de consulta antes de que realmente hagamos el filtrado.
‫Ahora sigamos adelante e implementemos eso.
‫Lo que haremos es, primero, crear
‫una copia superficial del objeto de consulta de punto de solicitud.
‫Llamémoslo objeto de consulta.
‫Aquí necesitamos, de verdad, una copia impresa.
‫No podemos simplemente hacer, solicitar una consulta de puntos,
‫porque entonces, si eliminara
‫algo de este objeto, también lo eliminaríamos
‫del objeto de consulta de puntos req.
‫Y eso es
‫porque en JavaScript, cuando establecemos una variable en otro
‫objeto, esa nueva variable será básicamente
‫una referencia a ese objeto original.
‫Entonces realmente necesitamos una copia impresa aquí.
‫En JavaScript, no hay realmente una forma
‫incorporada de hacer esto, pero un truco muy
‫bueno que podemos usar, desde ES6, es usar, primero, la estructuración que
‫usamos usando dot dot dot.
‫Y luego podemos simplemente crear un nuevo objeto
‫a partir de eso.
‫Así.
‫Esta estructuración aquí, estos tres
‫puntos, básicamente eliminará todos los campos del objeto.
‫Aquí con las llaves,
‫bueno, simplemente creamos un nuevo objeto.
‫Así que tenemos un nuevo objeto
‫que básicamente contendrá todos los pares clave-valor
‫que estaban en nuestro objeto de consulta de punto req.
‫Entonces esa es una copia.
‫Ahora creemos una matriz de
‫todos los campos que queremos excluir.
‫A ese lo llamo campos excluidos.
‫Y luego queremos excluir la página, así que esa es
‫la que les
‫acabo de decir antes en Postman.
‫Luego, también queremos excluir
‫la ordenación,
‫queremos excluir el
‫límite y queremos excluir campos.
‫Implementaremos toda la funcionalidad de paginación,
‫clasificación, limitación y selección de solo algunos
‫campos específicos, más adelante en los
‫próximos videos.
‫A continuación, lo que debemos hacer
‫es básicamente eliminar todos estos campos de nuestro
‫objeto de consulta.
‫Y para hacer
‫eso, recorreremos estos campos.
‫Entonces, campos
‫excluidos para cada uno.
‫Y estamos usando para cada
‫uno porque no queremos guardar una nueva matriz.
‫Luego, para cada uno de
‫estos elementos, podemos usar el operador de eliminación.
‫Y luego, desde el
‫objeto de consulta, queremos eliminar el campo
‫con el nombre del elemento, por lo
‫que el elemento actual en la matriz.
‫Así, primero borraremos el campo de la página, luego
‫el ordenamiento, luego el límite, luego los campos.
‫Por supuesto, solo en caso de que esté ahí.
‫Si, por ejemplo, no hay un campo
‫de límite, entonces, por supuesto, no se eliminará, porque no
‫está allí.
‫Echemos ahora un vistazo si esto realmente funciona.
‫Voy a registrar la consulta de
‫punto de req y al mismo tiempo nuestro objeto de consulta.
‫Dando un salvamento a esto.
‫No se preocupe por nuestros resultados ahora.
‫Todo lo que quiero ver es
‫nuestro objeto de consulta, solo para asegurarme de que
‫esta lógica que tenemos aquí realmente funcione.
‫Agreguemos aquí una especie de uno y un límite de 10.
‫Estos tendrán más sentido más adelante.
‫Por ahora, solo los
‫estoy agregando, para luego poder excluirlos.
‫Los resultados no importan, todo lo que importa
‫es que nuestra consulta original es esta aquí, y luego nuestro
‫objeto de consulta, que es el que
‫vamos a usar,
‫solo tiene dificultad para configurarlo como fácil.
‫Eso es porque excluimos, paginamos, ordenamos y limitamos.
‫Esto ahora funciona, así que en
‫lugar de usar req dot query, usaremos nuestro objeto de consulta.
‫Vamos a deshacernos de eso e intentarlo de nuevo.
‫Ahora deberíamos volver a
‫consultar todos los documentos que tienen
‫una dificultad establecida en fácil e ignorar todos estos otros campos.
‫Envía eso.
‫Y, de hecho, volvemos
‫a los cuatro resultados que teníamos antes.
‫También podemos activar la duración y, de
‫hecho, ahora tendremos dos resultados.
‫¿Recuérdalo?
‫Y si los
‫apagamos, bueno, entonces, por supuesto, funcionará igual.
‫Eliminemos esta línea vacía aquí.
‫Y así, de hecho, con nuestra cadena de consulta original,
‫las cosas obviamente también funcionaron igual.
‫Preparamos nuestra función de filtro para que
‫ignore los campos de página, clasificación y límite.
‫Pero en realidad hay algo
‫más que debemos hacer en nuestro código,
‫para poder básicamente implementar estas funciones en videos futuros.
‫Volvamos aquí a nuestro código.
‫Así que ahora aprendamos
‫un poco sobre cómo funcionan realmente las consultas en Mongoose.
‫Creo que mencioné esto
‫antes, pero es muy importante hablar de esto nuevamente.
‫Este método de búsqueda aquí devolverá una consulta.
‫Todo esto aquí devolverá una consulta.
‫Y esa es la razón por
‫la que luego podemos encadenar otros métodos como este.
‫Como dónde, iguales y todos estos otros métodos de
‫los que les hablé antes.
‫Permítanme mostrarles eso en la documentación nuevamente.
‫Aquí tenemos el objeto de
‫consulta, y nuevamente, cuando usamos el
‫método de búsqueda, devolverá un objeto que es una consulta.
‫Entonces, en el prototipo de
‫punto de consulta, tenemos todos estos métodos.
‫Por ejemplo, aquí abajo tenemos dónde, que
‫acabo de mencionar.
‫Tenemos el tipo que es
‫el que usaremos más tarde para clasificar.
‫Tenemos, veamos, tenemos menos que
‫o menos que iguales, tenemos más.
‫Tenemos...
‫¿Qué más usamos?
‫Usamos iguales.
‫Todos estos son parte del prototipo de punto de consulta.
‫Lo cual, nuevamente, se refiere a los
‫objetos que estamos creando usando la clase de consulta.
‫Nuevamente, esta es la razón
‫por la que podemos hacer este tipo de encadenamiento.
‫Ahora viene la parte importante.
‫Tan pronto como realmente esperemos
‫el resultado de la consulta, tan pronto
‫como usemos esperar aquí o aquí, por ejemplo.
‫Tan pronto como usemos esta
‫espera, la consulta se ejecutará
‫y volverá con los
‫documentos que realmente coinciden con nuestra consulta.
‫Si lo hacemos así, como lo hemos hecho aquí, entonces
‫ahora hay una forma de, más
‫adelante, implementar la ordenación o la paginación, o
‫todas estas otras características.
‫En cambio, lo que tendremos
‫que hacer es guardar esta parte aquí en una consulta,
‫luego, al final, tan pronto como cambiemos todos los
‫métodos a la consulta que necesitamos, solo
‫entonces al final, podemos esperar que consulta.
‫Por ejemplo, usaremos el método de clasificación.
‫Vamos a utilizar el método
‫de predicción, vamos a utilizar el método de límite,
‫y vamos a utilizar, en realidad, un
‫montón de métodos y encadenarlos a esta consulta.
‫Eso sería imposible
‫de hacer, nuevamente, si esperamos el resultado de
‫esta consulta inicial aquí, de inmediato.
‫Espero que tenga sentido.
‫La forma en que lo
‫haremos es
‫que tendremos nuestros recorridos aquí.
‫Y esto esperará la consulta.
‫La consulta es, bueno, simplemente la
‫consulta sin esperas.
‫Solo para que sea consistente con
‫esta parte
‫aquí, hagámoslo así.
‫Digamos que,
‫primero, construimos la
‫consulta y luego la ejecutamos.
‫Eso no es correcto.
‫Ya que estamos haciendo
‫comentarios aquí,
‫digamos también enviar respuesta.
‫Solo para que nuestro código sea un poco más fácil de escanear.
‫Espero que todo
‫esto tenga sentido, resultó ser un
‫video bastante largo, pero
‫era importante terminar esta parte aquí
‫explicándoles esta lógica aquí, para que
‫en los próximos videos podamos
‫implementar la resto de funciones.
‫Porque, de nuevo,
‫sin tenerlo así, no funcionaría.