‫Instrutor: Bem-vindo de volta.
‫Então, depois de algumas aulas teóricas mais pesadas,
‫agora, vamos finalmente começar a implementar nosso modelo de dados
‫e começar com os locais.
‫Então, neste vídeo, você aprenderá
‫tudo sobre dados geoespaciais no MongoDB.
‫E este é realmente
‫um tópico que pessoalmente considero muito interessante.
‫Agora, lembre-se da aula anterior
‫que nossos dados de localização serão realmente
‫incorporados aos passeios.
‫Portanto, vamos basicamente declarar tudo o que
‫está relacionado aos locais em nosso
‫modelo de tour.
‫Tudo bem, então vamos abrir esse e bem no
‫final, vamos começar adicionando startLocation.
‫Ok, então teremos startLocation
‫e também locais em geral.
‫Agora, o MongoDB oferece suporte a dados geoespaciais prontos para uso.
‫E os dados geoespaciais são basicamente dados que
‫descrevem lugares na Terra usando coordenadas de longitude e latitude.
‫Ok, então podemos descrever
‫pontos simples ou podemos também descrever
‫geometrias mais complexas como linhas ou mesmo polígonos ou mesmo multipolígonos.
‫Então, realmente, tudo
‫é possível com dados geoespaciais no MongoDB.
‫Ok, então vamos adicionar nosso campo startLocation aqui e
‫então vamos implementar esses dados geoespaciais.
‫E o MongoDB usa um formato de dados especial chamado GeoJSON.
‫Tudo bem, então.
‫GeoJSON, a fim de especificar dados geoespaciais.
‫E agora, como isso realmente funciona?
‫Bem, este objeto que especificamos aqui é, na verdade,
‫desta vez, não para as opções de tipo de esquema como
‫temos, por exemplo, aqui em cima.
‫Portanto, este objeto aqui é para as opções de tipo de esquema.
‫Lembre-se disso?
‫Mas agora, este objeto aqui é na verdade
‫um objeto embutido.
‫E assim, dentro
‫desse objeto, podemos especificar algumas propriedades.
‫Tudo bem, e para que este objeto seja reconhecido
‫como JSON geoespacial, precisamos das propriedades do tipo
‫e das coordenadas, tudo bem.
‫Então, precisamos digitar e
‫coordenar, certo.
‫E agora, cada um
‫desses campos aqui, basicamente, cada um desses subcampos terá suas
‫próprias opções de tipo de esquema.
‫Tudo bem, basicamente aqui, é um pouco aninhado, então temos
‫um nível mais profundo.
‫Ok, então temos as opções de tipo de
‫esquema de tipo e também precisamos de opções de tipo
‫de esquema para coordenadas e novamente, assim como temos aqui nesses
‫outros campos, com a diferença de que agora são subcampos.
‫Portanto, o tipo precisa do tipo
‫de
‫string, certo, e o padrão deve ser o ponto.
‫Então, lembra como eu disse
‫que podemos especificar várias geometrias no MongoDB?
‫E o padrão é sempre apontar.
‫Mas, novamente, também podemos especificar polígonos ou linhas
‫ou outras geometrias como essa.
‫Mas, neste caso, para startLocation, realmente
‫deve ser o ponto.
‫E então vamos realmente tornar essa a única
‫opção possível, especificando o
‫enum, portanto, a propriedade de enumeração.
‫Portanto, lembre-se, podemos especificar um array
‫de todas as opções possíveis que este campo pode
‫assumir e, portanto, neste caso, queremos apenas que seja um ponto, tudo bem.
‫Então fizemos isso em algum lugar aqui.
‫Sim, bem aqui com
‫a dificuldade onde dissemos que só pode ser média ou difícil.
‫Certo, e aqui, estamos fazendo
‫a mesma coisa, mas apenas com uma opção, ok.
‫Portanto, precisamos definir o tipo,
‫lembre-se, e também, uma matriz de coordenadas.
‫Ok, então fazemos isso dizendo o
‫número, mas nessas chaves.
‫Ok, e isso basicamente significa que esperamos
‫um array de números e esse
‫array, como o nome diz, são as coordenadas
‫do ponto com a longitude primeiro e
‫só depois, a latitude.
‫E isso é um
‫pouco contra-intuitivo porque geralmente funciona ao contrário.
‫Mas no GeoJSON, é assim que funciona.
‫Portanto, se você for, por exemplo, ao
‫Google Maps para obter
‫suas coordenadas, verá primeiro a latitude e depois a longitude.
‫Vamos realmente dar uma olhada nisso.
‫Portanto, abra
‫o Maps aqui.
‫Digamos Nova York.
‫Ok, e se agora clicarmos em algum
‫lugar aqui, digamos aqui, então obteremos
‫as coordenadas primeiro com a latitude e, segundo, a longitude.
‫Certo, e caso você não esteja familiarizado com isso, vamos
‫apenas diminuir um pouco o zoom
‫aqui, para que possamos ver a Terra inteira.
‫Nossa, o que é isso?
‫OK.
‫Então, a latitude é basicamente a posição
‫horizontal medida em graus começando no
‫equador, daqui até aqui.
‫Então, no equador, é zero grau
‫e aqui em cima, no Pólo Norte, é 90 graus.
‫E então
‫a longitude é a mesma coisa, mas verticalmente.
‫Então é a posição começando de um meridiano, que
‫passa em algum lugar aqui, certo.
‫E então a longitude é a posição
‫vertical a partir daqui.
‫E é por isso que este ponto aqui que
‫temos, em
‫algum lugar aqui, em algum lugar aqui em Manhattan, tem
‫uma latitude de 40 e uma longitude de -73.
‫Tudo bem.
‫De qualquer forma, vamos voltar ao nosso código aqui, é claro,
‫porque também quero especificar uma propriedade para o endereço.
‫Então adicione outra string e também uma descrição deste
‫startLocation e de
‫novo, como uma string, tudo bem.
‫E não vamos dizer
‫que qualquer um desses campos deve ser
‫obrigatório porque queremos deixar startLocation em branco.
‫Ok, novamente, para especificar dados geoespaciais com MongoDB,
‫basicamente precisamos criar um novo objeto, como
‫fizemos aqui.
‫E esse objeto precisa ter pelo menos dois nomes de campo.
‫Portanto, as coordenadas tem essa matriz de números
‫e, em seguida, o tipo, que deve ser do
‫tipo string e deve ser ponto ou
‫alguma outra dessas geometrias que acabei de falar antes.
‫Ok, podemos então, é claro, adicionar mais alguns campos
‫a este objeto, como fizemos aqui, certo.
‫Agora, lembra como na última palestra nós
‫dissemos que íamos incorporar todos os locais
‫aos documentos da turnê?
‫Mas agora, o startLocation aqui não é
‫realmente um documento.
‫Na verdade, é apenas
‫um objeto que descreve um determinado ponto da Terra.
‫Mas para realmente criar novos
‫documentos e, em seguida, incorporá-los em
‫outro documento, precisamos criar um array, certo.
‫Na verdade, é muito semelhante ao que já temos aqui,
‫mas precisa ser um array.
‫E é isso que faremos com nossos locais.
‫Então, locais, e agora, estou criando um array.
‫E então neste array é onde
‫vou especificar o objeto como fiz antes em startLocation.
‫Ok, e você verá como
‫isso ficará em um segundo no aplicativo Compass.
‫Ok, e agora é exatamente o mesmo de antes.
‫Portanto, o tipo, lembre-se, de dados geoespaciais precisa
‫ser string.
‫O padrão precisa ser um ponto.
‫E também, não pode ser nada além de um ponto, certo.
‫Então aponte.
‫Novamente, precisamos das coordenadas como uma matriz de números e
‫também, para todas essas outras localizações,
‫ainda queremos especificar um endereço e uma descrição.
‫Então string e aqui, eu também quero especificar a data, então
‫como um número.
‫E esta data será basicamente o dia
‫do tour em que as pessoas irão para este local.
‫Agora, se quisermos torná-lo
‫mais simples, poderíamos excluir o startLocation todos juntos e,
‫em seguida, simplesmente definir o primeiro
‫local como startLocation e configurá-lo para o dia número zero.
‫Tudo bem, mas decidi que é
‫bom também ter startLocation como um campo separado.
‫Ok, então é assim que você cria documentos incorporados.
‫Lembre-se de que sempre precisamos usar este array, ok.
‫E assim, especificando basicamente uma matriz de objetos,
‫isso criará novos documentos dentro do
‫documento pai, que é, neste
‫caso, o passeio.
‫Tudo bem, agora, para criar alguns locais,
‫na verdade irei importar todos os nossos dados originais.
‫Tudo bem, então, em vez de criar
‫novos passeios, irei deletar
‫os que temos e importar os dados completos.
‫Então aqui, em dev-data,
‫lembre-se disso antes de importarmos tours simples.
‫Ok, então este tipo de dados aqui.
‫Mas também temos tours e
‫isso contém os locais e o startLocation.
‫Portanto, não tenho certeza de onde esse startLocation está.
‫Ah, aqui está.
‫Portanto, é assim que especificamos startLocation
‫e você verá que definimos o tipo para apontar.
‫Temos nosso conjunto de coordenadas.
‫E então, é claro, temos a descrição e o endereço.
‫E aqui embaixo, no local, temos um array, que contém
‫um objeto para cada local.
‫E você vê que, na verdade, cada um deles tem seu próprio id.
‫E então esses são
‫realmente documentos e não apenas objetos simples.
‫Tudo bem, então vamos aqui para o nosso import-dev-data e
‫substitua isso aqui apenas com tours.
‫Salve-o e lembre-se, primeiro precisamos excluir e depois
‫importar.
‫Então, indo para outro console aqui.
‫Agora queremos executar o
‫node, dev-data e, em seguida, importar, na
‫verdade, na pasta de dados e, em seguida, importar.
‫E comece excluindo e vamos aguardar e, de fato, e
‫agora, importar.
‫E aqui vamos nós.
‫E vamos verificar o Compass agora.
‫Venha para nossos passeios.
‫E então, de fato, agora você vê startLocation aqui
‫como um objeto.
‫Ok, e quando você abre isso, você
‫vê todos os dados que acabei de mostrar
‫a você no arquivo JSON.
‫Certo, então aqui também as localizações, que você vê
‫como um array, então digite array.
‫E aí, temos todos esses objetos e
‫cada objeto também tem seu id de objeto.
‫Ok, e novamente, esta é a prova de que agora criamos,
‫incorporamos ou desnormalizados conjuntos de dados, ou seja,
‫conjuntos de dados que têm uma relação muito próxima com
‫os dados dos passeios.
‫E é por isso que optamos por
‫realmente torná-lo parte dos passeios em vez de criar sua
‫própria coleção apenas para locais, certo.
‫Na verdade, usaremos isso um pouco mais tarde
‫nesta seção, uma vez que começarmos a criar algumas consultas geoespaciais especiais.
‫Ok, e com as consultas geoespaciais, podemos
‫fazer coisas realmente incríveis, como encontrar
‫dados de locais mais próximos de certos pontos ou
‫encontrar todos os locais dentro de um determinado
‫raio ou esfera.
‫E realmente, as possibilidades são absolutamente infinitas, ok.
‫Portanto, veremos apenas algumas aplicações disso no
‫final desta seção porque, por
‫enquanto, eu realmente queria mostrar a vocês
‫como podemos criar conjuntos de dados incorporados da mesma forma que fizemos.