‫Bem-vindo de volta após uma longa
‫palestra em que pesquisamos documentos
‫turísticos a uma
‫certa distância de um certo ponto usando consultas geoespaciais.
‫Agora, nesta aula, vamos usar a agregação geoespacial para calcular as
‫distâncias de todos os
‫passeios a partir de um determinado ponto.
‫Assim como antes, vamos começar
‫definindo a rota para sabermos
‫com quais dados trabalharemos.
‫Então, roteador. rota; neste momento, vou chamá-lo
‫simplesmente de distâncias, e então os dados de que precisamos são
‫a latitude e a longitude do
‫ponto onde o usuário
‫está atualmente, então em nosso
‫exemplo anterior era LA, e então vamos
‫permitir que
‫o usuário novamente para especificar a unidade.
‫Então aqui, a função de manipulador de rota.
‫Agora,
‫desta vez aqui, não precisamos do parâmetro
‫de distância, como tínhamos
‫aqui, porque não estaremos procurando por um determinado raio.
‫Vamos mesmo calcular a distância de
‫um determinado ponto a todos os passeios
‫que temos em nossa coleção.
‫Portanto, o manipulador está em tourController
‫e será chamado getDistances.
‫Ainda não temos isso, então vamos criá-lo.
‫CatchAsync e, claro, marque a função como assíncrona também,
‫porque já sabemos que usaremos
‫o pipeline de agregação
‫e, portanto, no momento, estaremos
‫usando uma espera.
‫O início desta função é, na verdade, bastante semelhante ao getToursWithin,
‫portanto, vamos seguir em frente e apenas copiar
‫todo esse código.
‫Temos algumas unidades semelhantes, então também precisamos obter
‫a latitude e
‫longitude, e também precisamos criar
‫este erro caso não haja latitude ou longitude.
‫Este aqui não se aplica
‫e também não temos a distância.
‫Portanto, vamos agora fazer o cálculo real.
‫Assim como antes, para fazer
‫cálculos, sempre usamos o pipeline de agregação.
‫E lembre-se, isso é chamado no próprio modelo.
‫Então, faça um tour. agregar.
‫Então vamos esperar por isso e salvá-lo
‫na variável de distâncias.
‫Então aqui, lembre-se, passamos um array
‫com todos os estágios do pipeline de
‫agregação que queremos definir.
‫Agora, para agregação geoespacial,
‫há na verdade apenas um único estágio, e
‫isso é chamado geoNear, então este.
‫Novamente, este é o único
‫estágio de pipeline de agregação geoespacial que realmente existe.
‫Este sempre precisa ser o primeiro no pipeline.
‫Portanto, tenha isso em mente que
‫geoNear sempre precisa ser o primeiro estágio.
‫Outra coisa que também é muito importante observar
‫sobre geoNear é que ele requer que
‫pelo menos um de
‫nossos campos contenha um índice geoespacial.
‫Na verdade, já fizemos isso
‫antes, então vamos dar uma olhada novamente.
‫Nosso local de partida
‫já tem este índice geoespacial da 2esfera.
‫Já que estamos usando este startLocation
‫para calcular as
‫distâncias, então isso é perfeito.
‫Se houver apenas um campo
‫com um índice geoespacial, este estágio geoNear aqui usará
‫automaticamente esse índice para realizar o cálculo.
‫Mas se você tiver vários campos com índices geoespaciais,
‫precisará usar o parâmetro keys para
‫definir o campo
‫que deseja usar para os cálculos.
‫Portanto, tenha isso em
‫mente, mas, novamente, neste caso,
‫temos apenas um campo e, portanto, automaticamente esse
‫campo startLocation será usado para fazer esses cálculos.
‫Então, o que precisamos passar para geoNear?
‫Bem, primeiro precisamos especificar a propriedade near e near
‫é o ponto a partir do qual calcular as distâncias.
‫Portanto, todas as distâncias serão calculadas a partir deste ponto
‫que definimos aqui e, em seguida, todos os locais de início.
‫Portanto, este ponto próximo aqui é,
‫obviamente, o ponto que passamos para esta função
‫com esta latitude e longitude.
‫Agora precisamos especificar este ponto aqui como geojson, de modo que
‫é exatamente como fizemos antes,
‫onde precisamos especificar o tipo como Ponto
‫e, em seguida, especificar a propriedade de coordenadas.
‫E como sempre, a primeira coordenada aqui é a
‫longitude, e depois a segunda, a latitude.
‫E vamos multiplicar os dois por um,
‫simplesmente para convertê-lo em números.
‫Portanto, este é o primeiro campo obrigatório, near, e
‫o segundo é a propriedade do campo distance.
‫Então, distanceField, e então esse é o
‫nome do campo que será
‫criado e onde todas as distâncias calculadas serão armazenadas.
‫Então, vamos simplesmente chamar essa distância.
‫Na verdade, é isso.
‫Esses são todos os
‫campos obrigatórios neste estágio geoNear.
‫E, claro, podemos adicionar outros estágios aqui, e
‫vamos fazer isso um pouco mais tarde,
‫mas por enquanto tudo o
‫que quero fazer é realmente ver os resultados desse trabalho.
‫Vamos copiar novamente esse resultado aqui, enviando assim esses
‫resultados, e aqui vamos enviar então as distâncias, e
‫também esse que
‫não precisamos.
‫Então, estamos prontos para começar.
‫Lembre-se de que não usamos a unidade neste momento, mas
‫não se preocupe com isso.
‫Faremos isso em um segundo,
‫mas, novamente, primeiro eu realmente quero ver isso funcionando.
‫Lembre-se de que a rota agora está em distâncias,
‫então vamos apenas copiar esta aqui.
‫Na verdade, vou salvá-lo também,
‫para os passeios.
‫Digamos que obtenha tours dentro do raio.
‫Isso aqui se chama distâncias, e a gente não
‫tem isso e também não tem isso.
‫Então, apenas as coordenadas e, em seguida, novamente a unidade.
‫Vamos dar uma olhada e agora obteremos esse erro.
‫Lembre-se de como dissemos que geoNear
‫sempre precisa ser o primeiro estágio em um pipeline,
‫mas se você der
‫uma olhada no código, poderá pensar que, na verdade, nosso estágio geoNear
‫é atualmente o primeiro estágio de nosso pipeline.
‫Porque bem aqui, realmente parece que está, certo?
‫Não há nada antes disso, então por que recebemos
‫esse erro de que geoNear não é o primeiro estágio do pipeline?
‫Na verdade, demorei um pouco para descobrir isso porque isso tem
‫a ver com um trecho de código que
‫escrevemos há muito tempo.
‫Isso está aqui no modelo
‫turístico, e se formos aqui, eu acho.
‫Bem aqui, temos esse middleware de agregação e lembre-se
‫de que o que isso fez foi sempre adicionar esse estágio de
‫correspondência aqui antes de todos os outros estágios e, na verdade,
‫temos esse console. registre aqui
‫e, de fato, você pode ver
‫todo o pipeline aqui.
‫E então você vê que primeiro temos
‫a correspondência e, em seguida, a
‫fase geoNear aqui, na verdade apenas como a segunda fase.
‫Então, realmente faz sentido que recebamos esse erro.
‫Agora poderíamos ir em frente e alterar
‫esse middleware aqui e dizer que se geoNear for
‫o primeiro operador no pipeline, simplesmente não faça isso aqui.
‫Mas isso é um pouco demais para este caso de uso, então
‫tudo que vou fazer é me livrar desse middleware.
‫Então salve isso e agora vamos tentar novamente.
‫Agora temos nossos tours, e agora ele deve
‫ter aquele campo de distância neles.
‫Então, vamos pesquisar isso e, de fato, aqui vai.
‫Então, a distância, e então esse número enorme aqui.
‫É um número grande,
‫porque na verdade é calculado em
‫metros, então esse resultado vem em
‫metros, então vamos primeiro converter este para quilômetros.
‫Mais tarde, também iremos convertê-lo em milhas, porque
‫lembre-se de que especificamos a unidade em milhas, mas por
‫enquanto a solução mais fácil
‫é convertê-la em quilômetros, porque tudo
‫o que temos
‫que fazer para isso é apenas dividir por 1000.
‫E também o que
‫eu quero fazer é pegar realmente apenas as distâncias
‫e o nome dos passeios.
‫Portanto, livre-se de toda a desordem que temos aqui
‫e concentre-se apenas nas distâncias em si.
‫Para isso, como você deve
‫se lembrar, podemos usar a etapa de projeto.
‫Então, vamos adicionar isso aqui como o segundo estágio.
‫Portanto, projete e basicamente os nomes dos campos
‫que queremos manter.
‫Essa é a distância, e definimos um para um,
‫dizendo que queremos mantê-la, e também o nome
‫para que possamos saber de que turnê estamos falando.
‫Com isso nos livramos de todos os
‫outros dados, e agora vamos basicamente dividir a distância
‫por 1000 para converter esses metros em quilômetros.
‫Na verdade, é muito
‫fácil fazer isso, porque em um estágio geoNear
‫podemos especificar a propriedade do multiplicador de distância.
‫Então distanceMultiplier, e aqui podemos especificar um número que será
‫multiplicado por todas as distâncias.
‫Aqui especificamos 0. 001, e isso é exatamente o mesmo
‫que dividir por 1000.
‫Então, vamos testar nosso resultado aqui agora.
‫E esse cálculo aparentemente leva algum tempo, mas
‫agora vamos lá.
‫Portanto, agora você obtém este bom resultado aqui em quilômetros.
‫Como você pode ver, o Sports Lover é o passeio mais
‫próximo do local em Los Angeles que marcamos.
‫Portanto, está a apenas 64 quilômetros de distância, o que
‫deve ser algo em torno de 40 milhas.
‫Mas, novamente, faremos essa conversão em um segundo.
‫Por enquanto, eu só quero voltar a esse mapa e bússola
‫e ver se isso realmente faz sentido.
‫Ainda estamos aqui, e ainda temos nosso
‫mapa de locais de partida.
‫Agora, o
‫problema aqui é que não podemos realmente clicar em qualquer
‫um desses pontos e ver o que são.
‫Mas vamos desenhar um círculo rápido aqui novamente para
‫ver quais são os passeios mais
‫próximos e se eles correspondem aos de nossa saída.
‫Então é meio aqui, eu
‫acredito, então vamos incluir esses cinco tours aqui.
‫Seus nomes são Park Camper, Snow Adventurer, Wine Taster,
‫Sports Lover e Star Gazer, e agora,
‫quando chegamos aqui,
‫esses são os primeiros cinco.
‫Amante de esportes, Park
‫Camper, Wine Taster, Star Gazer e Snow Adventurer.
‫Aquele que está realmente perto é o Amante do Esporte, e
‫o próximo é o Park Camper e
‫o Provador de Vinhos.
‫Este aqui vai ser o Park Camper,
‫que eu acredito que começa em
‫Las Vegas, então
‫faz sentido, e então um terceiro
‫está aqui, The Wine Taster perto de San Francisco.
‫Então essa distância de 800 quilômetros eu acho, ou o que
‫foi isso?
‫Sim, 600 quilômetros, isso realmente faz sentido.
‫Então, algo perto de 400 milhas aqui.
‫E por falar em milhas, vamos realmente
‫fazer essa conversão agora.
‫Vamos fazer algo semelhante ao que fizemos antes, então
‫testando para a unidade.
‫Vamos criar uma variável
‫multiplicadora, novamente um operador ternário aqui,
‫então se for milhas, qual deveria ser o nosso multiplicador?
‫Bem, vamos simplesmente pesquisar
‫no Google o que é um metro em milhas.
‫Um metro para milhas, e o Google geralmente
‫nos dá uma resposta muito boa e, de fato, é.
‫Portanto, se este for um metro, tudo o que precisamos
‫fazer é realmente multiplicar nosso resultado em metros
‫por esse número.
‫Então vamos copiar aqui e voltar, então este deve
‫ser nosso multiplicador caso
‫a unidade seja metros, ou na verdade caso sejam milhas.
‫E no caso de ser metros,
‫então é esse 0. 001 que usamos antes.
‫Não o queremos
‫em metros, porque não é uma unidade legível.
‫Em vez disso, queremos em quilômetros.
‫Agora podemos ir em frente e usar a
‫variável multiplicadora aqui, salvá-la e vamos testá-la.
‫Então, dê uma olhada no que temos aqui
‫em quilômetros, a partir do resultado anterior, que é 64.
‫Isso deve ser aproximadamente 40 milhas, então vamos enviar isso, e
‫isso foi bem perto.
‫Então, 40. 2 milhas de fato.
‫E esse é o nosso
‫passeio mais próximo, e o mais distante é o City Wonderer, que acho que começa
‫em Nova York ou algo assim, e fica
‫a mais de 2.400 milhas de L. UMA.
‫Se definirmos aqui para quilômetros, então ele deve
‫voltar a obter o valor que
‫tínhamos antes.
‫Vamos colocar de volta em milhas,
‫porque eu sei que a maioria das pessoas que assistem a este curso
‫são dos Estados Unidos. S. , e lá
‫eles usam milhas em vez de quilômetros.
‫Então, vamos salvar isso aqui também para
‫nossa coleção obter as distâncias dos passeios a partir do ponto.
‫Então é isso, isso encerra esta palestra, e
‫isso é tudo que eu tinha para mostrar a vocês sobre dados geoespaciais.
‫Portanto, este vídeo e o último devem ter
‫dado a você uma ótima visão
‫geral de como trabalhar com dados geoespaciais no MongoDB.
‫E como eu disse antes, há muitas possibilidades de
‫coisas que você pode fazer em seus próprios aplicativos
‫usando esse tipo de dados.