‫Bienvenidos de nuevo después de una larga
‫conferencia en la que buscamos documentos
‫turísticos dentro de
‫una cierta distancia desde cierto punto utilizando consultas geoespaciales.
‫Ahora, en esta lección, usemos la agregación geoespacial para calcular
‫las distancias a todos
‫los recorridos desde un punto determinado.
‫Así que, al igual que antes, comencemos por
‫definir la ruta para que sepamos con
‫qué datos vamos a trabajar.
‫Entonces enrutador. ruta; En este momento, lo
‫llamaré simplemente distancias, y luego los datos que necesitamos son la
‫latitud y la longitud del punto
‫donde se encuentra el
‫usuario actualmente, por lo que
‫en nuestro ejemplo anterior era LA, y
‫luego también permitamos
‫al usuario nuevamente para especificar la unidad.
‫Entonces aquí, la función del controlador de ruta.
‫Ahora,
‫esta vez aquí, no necesitamos el parámetro
‫de distancia, ya que
‫lo teníamos aquí, porque no buscaremos un cierto radio.
‫Realmente vamos a calcular la distancia
‫desde un punto determinado hasta todos los recorridos
‫que tenemos en nuestra colección.
‫Entonces, el controlador está en tourController
‫y se llamará getDistances.
‫No tenemos eso todavía, así que creémoslo.
‫CatchAsync, y luego, por supuesto, marque la función como asíncrona
‫también porque ya sabemos que usaremos
‫la canalización de agregación, por
‫lo que para cuando estaremos
‫usando una espera.
‫El comienzo de esta función es bastante similar al getToursWithin
‫one, así que sigamos adelante y copiemos
‫todo este código.
‫Tenemos algunas unidades similares, luego también necesitamos obtener la
‫latitud y la longitud,
‫y también necesitamos crear este error
‫en caso de que no haya latitud o longitud.
‫Este de aquí no se
‫aplica, y tampoco tenemos la distancia.
‫Así que hagamos ahora el cálculo real.
‫Al igual que antes, para hacer
‫cálculos, siempre usamos la canalización de agregación.
‫Y recuerde, eso se llama en el modelo en sí.
‫Entonces Tour. agregar.
‫Entonces esperemos eso y guárdelo en la
‫variable de distancias.
‫Entonces aquí, recuerde, pasamos en una matriz
‫con todas las etapas de la canalización de
‫agregación que queremos definir.
‫Ahora, para la agregación
‫geoespacial, en realidad solo hay una etapa, y
‫se llama geoNear, por lo que esta.
‫Una vez más, esta es la
‫única etapa de canalización de agregación geoespacial que existe realmente.
‫Este siempre debe ser el primero en la tubería.
‫Por lo tanto, tenga en cuenta
‫que geoNear siempre debe ser la primera etapa.
‫Otra cosa que también es muy importante tener
‫en cuenta sobre geoNear es que requiere
‫que al menos uno de
‫nuestros campos contenga un índice geoespacial.
‫En realidad, ya lo hicimos
‫antes, así que echemos un vistazo nuevamente.
‫Nuestra ubicación de inicio
‫ya tiene este índice geoespacial de 2 esferas.
‫Ya que estamos usando esta ubicación
‫de inicio para calcular
‫las distancias, bueno, eso es perfecto.
‫Si solo hay un campo
‫con un índice geoespacial, esta etapa geoNear aquí usará
‫automáticamente ese índice para realizar el cálculo.
‫Pero si tiene varios campos con índices geoespaciales, entonces
‫necesita usar el parámetro de claves para
‫definir el campo
‫que desea usar para los cálculos.
‫Así que tenga eso
‫en cuenta, pero de nuevo, en
‫este caso solo tenemos un campo, por lo que automáticamente
‫ese campo startLocation se utilizará para hacer estos cálculos.
‫Entonces, ¿qué debemos pasar a geoNear?
‫Bueno, primero necesitamos especificar la propiedad near, y
‫near es el punto desde el cual calcular las distancias.
‫Entonces, todas las distancias se calcularán a partir de este
‫punto que definimos aquí, y luego todas las ubicaciones de inicio.
‫Entonces, este punto cercano aquí es, por
‫supuesto, el punto en el que pasamos a esta
‫función con esta latitud y longitud.
‫Ahora necesitamos especificar este punto aquí como geojson, así que
‫es como lo hicimos
‫antes, donde necesitamos especificar el tipo como
‫Punto, y luego especificar la propiedad de coordenadas.
‫Y como siempre, la primera coordenada aquí es la
‫longitud, y luego la segunda, la latitud.
‫Y multipliquemos ambos por uno, simplemente
‫para convertirlos en números.
‫Este es el primer campo obligatorio, cerca, y el
‫segundo es la propiedad del campo de distancia.
‫Por lo tanto, distanceField, por lo que este
‫es el nombre del campo que
‫se creará y donde se almacenarán todas las distancias calculadas.
‫Así que llamémoslo simplemente una distancia.
‫De hecho, eso es todo.
‫Esos son todos los campos que
‫son obligatorios en esta etapa de geoNear.
‫Y, por supuesto, podemos agregar otras etapas aquí, y
‫de hecho lo haremos un poco más tarde,
‫pero por ahora todo lo
‫que quiero hacer es ver realmente los resultados de este trabajo.
‫Copiemos nuevamente este resultado aquí, enviando así estos
‫resultados, y aquí, luego enviemos las distancias, y
‫también esta que
‫no necesitamos.
‫Entonces, estamos listos para comenzar.
‫Tenga en cuenta que en este punto no usamos la unidad,
‫pero no se preocupe por eso.
‫Lo haremos en un segundo,
‫pero de nuevo, primero quiero que esto funcione.
‫Recuerde que la ruta ahora son distancias,
‫así que copiemos esta aquí.
‫De hecho, también lo guardaré, así
‫que en los recorridos.
‫Digamos que obtenga recorridos dentro del radio.
‫Esto aquí se llama distancias, y no
‫tenemos esto ni tampoco esto.
‫Entonces solo las coordenadas, y luego nuevamente la unidad.
‫Echemos un vistazo y ahora obtendremos este error.
‫Recuerde cómo dijimos que geoNear
‫siempre debe ser la primera etapa de una canalización,
‫pero si ahora echa
‫un vistazo al código, podría pensar que en realidad nuestra etapa geoNear
‫es actualmente la primera etapa de nuestra canalización.
‫Porque aquí mismo parece que lo es, ¿verdad?
‫No hay nada antes de esto, entonces, ¿por qué recibimos
‫este error de que geoNear no es la primera etapa en la tubería?
‫En realidad, me tomó un poco de tiempo resolver esto porque tiene
‫algo que ver con un fragmento de código
‫que escribimos hace mucho tiempo.
‫Eso está aquí en el modelo
‫de gira, y si bajamos aquí, creo.
‫Aquí mismo, tenemos este middleware de agregación, y recuerde
‫que lo que hizo fue agregar siempre esta etapa de coincidencia
‫aquí antes de todas las otras etapas, y de hecho tenemos
‫esta consola. inicie sesión
‫aquí y, de hecho, puede ver
‫toda la tubería aquí.
‫Y entonces ves que primero tenemos la
‫coincidencia, y luego la fase
‫geoNear aquí, en realidad solo como la segunda etapa.
‫Entonces, en realidad, tiene sentido que obtengamos ese error.
‫Ahora podríamos seguir adelante y cambiar este
‫middleware aquí y decir que si geoNear es el
‫primer operador en la tubería, simplemente no haga esto aquí.
‫Pero eso es demasiado trabajo para este caso de uso, así que todo
‫lo que voy a hacer es deshacerme de este middleware.
‫Así que guarde esto, y ahora intentémoslo de nuevo.
‫Ahora tenemos nuestros recorridos, y ahora debería tener
‫ese campo de distancia en ellos.
‫Así que busquemos eso, y de hecho aquí va.
‫Entonces la distancia, y luego este gran número aquí.
‫Es este número grande,
‫porque en realidad está calculado en metros,
‫por lo que este resultado viene en
‫metros, así que primero convierta este a kilómetros.
‫Más adelante, también lo convertiremos a millas, porque
‫recuerde que especificamos la unidad en millas, pero por
‫ahora la solución más
‫fácil es convertirla a kilómetros,
‫porque todo lo
‫que tenemos que hacer es dividirla entre 1000.
‫Y también lo
‫que quiero hacer es conocer solo las distancias y
‫el nombre de los recorridos.
‫Así que deshágase de todo el desorden que tenemos aquí
‫y realmente solo concéntrese en las distancias mismas.
‫Para eso, como recordará,
‫podemos utilizar la etapa de proyecto.
‫Así que agreguemos eso aquí como la segunda etapa.
‫Entonces proyecte, y luego básicamente los nombres de los campos
‫que queremos mantener.
‫Así que esa es la distancia, por lo que establecemos eso
‫uno a uno, diciendo que queremos mantenerlo, y luego
‫también el nombre para que realmente sepamos de qué gira estamos hablando.
‫Con eso nos deshacemos de todos
‫los demás datos, y ahora dividamos básicamente la distancia
‫entre 1000 para convertir estos metros en kilómetros.
‫En realidad, es muy
‫fácil hacer eso, porque en una etapa geoNear
‫podemos especificar la propiedad del multiplicador de distancia.
‫Entonces, distanciaMultiplicador, y aquí podemos especificar un número que luego
‫se multiplicará por todas las distancias.
‫Aquí especificamos 0. 001, por lo que es exactamente lo mismo
‫que dividir por 1000.
‫Así que probemos nuestro resultado aquí ahora.
‫Y ese cálculo aparentemente lleva algo de tiempo, pero
‫ahora aquí vamos.
‫Así que ahora obtienes este buen resultado aquí en kilómetros.
‫Como ves, el Sports Lover es el tour más cercano
‫a la ubicación en Los Ángeles que marcamos.
‫Así que está a solo 64 kilómetros de distancia, lo
‫que debería ser algo así como 40 millas.
‫Pero nuevamente, haremos esa conversión en un segundo.
‫Por ahora, solo quiero volver a ese mapa y brújula
‫y ver si esto realmente tiene sentido.
‫Así que todavía estamos aquí y todavía tenemos
‫nuestro mapa de ubicaciones de inicio.
‫Ahora bien,
‫el problema aquí es que en realidad no podemos hacer clic
‫en ninguno de estos puntos y ver cuáles son.
‫Pero dibujemos un círculo rápido aquí nuevamente para
‫ver cuáles son los recorridos más
‫cercanos y si coinciden con los de nuestra salida.
‫Creo que está aquí,
‫así que incluyamos estos cinco recorridos aquí.
‫Sus nombres son The Park Camper, Snow Adventurer, Wine Taster,
‫Sports Lover y Star Gazer, y ahora
‫que venimos aquí, estos
‫son en realidad los primeros cinco.
‫Amante de los deportes, Park
‫Camper, Cata de vinos, Star Gazer y Snow Adventurer.
‫Así que el que está realmente cerca es el Sports Lover,
‫y luego el siguiente es el Park
‫Camper y el Wine Taster.
‫Este de aquí será el Park Camper,
‫que creo que comienza en Las
‫Vegas, así que
‫tiene sentido, y luego un tercero
‫está aquí, The Wine Taster cerca de San Francisco.
‫Entonces, creo que esa distancia de 800 kilómetros, ¿o qué
‫fue eso?
‫Sí, 600 kilómetros, eso en realidad tiene sentido.
‫Entonces, algo cerca de 400 millas aquí.
‫Y hablando de millas, hagamos esa
‫conversión ahora mismo.
‫Hagamos algo similar a lo que hicimos antes,
‫para probar la unidad.
‫Creemos una variable multiplicadora,
‫nuevamente un operador ternario aquí, así
‫que si son millas, ¿cuál debería ser nuestro multiplicador?
‫Bueno, en realidad, simplemente
‫busquemos en Google qué es un metro en millas.
‫Un metro a millas, y Google generalmente
‫nos da una respuesta bastante agradable, y así es.
‫Entonces, si esto es un metro, entonces todo lo que tenemos
‫que hacer es realmente multiplicar nuestro resultado en metros
‫con este número.
‫Copiemos aquí y retrocedamos, entonces este debería ser nuestro multiplicador
‫en caso de que la
‫unidad sea metros, o en realidad en caso de que sean millas.
‫Y en caso de que sean metros,
‫entonces es ese 0. 001 que usamos antes.
‫No lo queremos en
‫metros, porque en realidad no es una unidad legible.
‫En cambio, lo queremos en kilómetros.
‫Así que ahora podemos seguir adelante y usar
‫la variable multiplicadora aquí, guardarlo y probarlo.
‫Así que eche un vistazo a lo que tenemos
‫aquí en kilómetros, desde el resultado anterior, que es 64.
‫Eso debería ser aproximadamente 40 millas, así que enviemos eso,
‫y estuvo bastante cerca.
‫Entonces 40. 2 millas de hecho.
‫Y esos son nuestros recorridos
‫más cercanos, y el más lejano es el City Wonderer, que creo que comienza
‫en Nueva York o algo así, y está
‫a más de 2400 millas de L. UNA.
‫Si luego lo configuramos aquí en kilómetros, entonces
‫debería volver a obtener el valor que
‫teníamos antes.
‫Volvamos a las millas porque
‫sé que la mayoría de las personas que ven este curso
‫son de la U. S. , y entonces
‫usan millas en lugar de kilómetros.
‫Así que guardemos esto aquí también
‫para nuestra colección obtener distancias a recorridos desde un punto.
‫Así que eso es todo, eso concluye esta
‫conferencia, y eso es todo lo que tuve que mostrarles sobre los datos geoespaciales.
‫Entonces, este video y el último deberían
‫haberle dado una excelente descripción general
‫de cómo trabajar con datos geoespaciales en MongoDB.
‫Y como dije antes, hay un montón de posibilidades
‫de cosas que puedes hacer en tus propias aplicaciones
‫usando este tipo de datos.