‫Instrutor: Agora que
‫você conhece os fundamentos do
‫Mongoose implementando todas as quatro operações
‫corretas, é agora que você finalmente importa os dados de nosso
‫tour um pouco melhor para torná-lo mais completo.
‫Portanto, neste ponto, nossos documentos de viagem podem ter apenas um nome,
‫uma classificação e um preço.
‫Mas é claro, precisamos de muito mais
‫dados aqui, porque o objetivo é ter uma API muito rica
‫em dados, como esta.
‫Então, vamos dar uma olhada na versão final,
‫na verdade, aqui como uma referência.
‫E então é este aqui.
‫E então temos todas as
‫turnês, e vai se parecer um pouco com isso.
‫Ok, então você vê que em
‫cada passeio, temos um local de início, temos a média
‫de classificações, quantidade de classificações, imagens, datas de início.
‫Guias, nome, duração, tamanho máximo do grupo, dificuldade,
‫preço, resumo,
‫descrição, capa da imagem, localizações.
‫Até mesmo uma lesma, revisões, duração em semanas e o ID.
‫Então, você vê muitos dados,
‫e não vamos adicionar todos os dados
‫nesta aula aqui.
‫Existem algumas peças que ainda não podemos
‫adicionar, mas podemos, é claro, torná-las um pouco mais completas, certo?
‫E vamos salvar isso aqui, como uma referência, e pegar
‫todos os tours, e vou colocá-lo
‫fora de qualquer pasta.
‫Então, vamos colocá-lo aqui no topo.
‫E isso não funciona por algum motivo.
‫Ok, vamos apenas colocar aqui, então.
‫Ok, vamos ver, isso é
‫correto.
‫E então, novamente, estou deixando isso
‫aqui, a fim de continuar comparando o que
‫temos com o que pretendemos.
‫De qualquer forma, vamos voltar e começar
‫com o que já temos, e
‫temos o nome.
‫E isso já está bom
‫o suficiente, então por enquanto vou deixar assim.
‫Então, o nome, então também queremos uma duração.
‫E essa duração é um número e é obrigatório.
‫Portanto, defina como verdadeiro e a
‫mensagem é: um passeio deve ter uma duração.
‫Então, esses validadores obrigatórios aqui são basicamente os
‫únicos validadores que vou adicionar
‫a cada um desses campos aqui por enquanto.
‫Mais tarde, quando vamos falar
‫mais detalhadamente sobre validadores, vamos adicionar muito mais.
‫Mas, novamente, por enquanto,
‫quero apenas tornar alguns desses campos, não todos, obrigatórios.
‫Em seguida, temos o tamanho do grupo.
‫Então, basicamente, quantas pessoas podem fazer parte
‫de uma turnê no máximo.
‫E então eu chamo isso de maxGroupSize.
‫E então isso deve
‫ser um número, e é novamente necessário.
‫O passeio deve ter um tamanho de grupo.
‫Não se esqueça da vírgula aqui.
‫Em seguida, também precisamos de uma dificuldade.
‫E esse aqui é uma string, e mais tarde,
‫vamos definir que deve ser médio,
‫fácil ou difícil, mas, novamente, isso é
‫na verdade um validador,
‫e vou deixar isso para um momento posterior.
‫Ok, por enquanto, estou apenas dizendo
‫que deve haver uma dificuldade.
‫A seguir, vamos falar sobre as classificações.
‫Portanto, agora temos um campo chamado Avaliação, mas na
‫verdade queremos um campo para a
‫média da avaliação e
‫um campo para a quantidade de avaliações.
‫Basicamente, a quantidade de avaliações que existem.
‫Posteriormente, haverá outro recurso chamado avaliações, onde os
‫usuários poderão escrever avaliações sobre
‫passeios e dar avaliações.
‫E isso vai ser um recurso completamente diferente
‫e um modelo completamente diferente.
‫Mas, ainda assim, queremos ter basicamente
‫um resumo dessas avaliações e dessas avaliações aqui nos tours.
‫Tudo bem, e os motivos para isso você aprenderá
‫um pouco mais tarde, quando começarmos como e por que modelamos dados em bancos
‫de dados NoSQL e, especificamente, no MongoDB.
‫Ok, por enquanto, vamos apenas adicionar a média das avaliações e
‫a quantidade das avaliações.
‫Ok, então deixamos isso aqui como
‫número, e com
‫esse padrão, e a quantidade de classificações, ratingsQuantity.
‫Isso também deve ser um número,
‫e o padrão será zero.
‫Porque é claro que no começo
‫não haverá absolutamente nenhuma crítica, quando a turnê for nova.
‫Bem, eu não dei a essas duas propriedades
‫aqui um valor obrigatório, porque não é o
‫usuário que cria
‫esses passeios que vai realmente especificar esses valores, certo?
‫Então, quando criarmos
‫um novo roteiro, nunca especificaremos as
‫avaliaçõesA Average, nem a
‫ratingsQuantity, pois isso será calculado
‫posteriormente a partir das avaliações reais, ok?
‫Em seguida, temos o preço aqui,
‫então está bom assim,
‫e também podemos ter um desconto.
‫Então, digamos que essa
‫empresa, a Natours, queira dar um desconto para um dos passeios em algum
‫momento, e para que eles possam
‫especificar um preço com desconto aqui também.
‫Portanto, priceDiscount, vamos colocá-lo aqui em número.
‫Não precisamos de nenhuma opção de tipo de esquema aqui.
‫Por exemplo, não é
‫obrigatório e, por enquanto, vamos deixar assim.
‫A seguir, podemos especificar um resumo do passeio.
‫Portanto, o resumo é do tipo String.
‫Mas não vou torná-lo obrigatório.
‫Ok, e isso é simplesmente porque
‫não está na página inicial do nosso site.
‫Ok, basicamente não está na visão geral.
‫E vou mostrar isso em um segundo,
‫mas por enquanto, deixe-me
‫adicionar aqui outra opção de tipo de esquema que ainda não mostrei,
‫que é chamada de trim.
‫E o corte só funciona para cordas.
‫E vou definir como verdadeiro.
‫Portanto, lembre-se de como eu disse que existem diferentes tipos
‫de esquema para diferentes tipos aqui e,
‫portanto, para string, temos um tipo de esquema que é trim,
‫que removerá todos os espaços
‫em branco no início e no final da string.
‫Ok, então se alguém entrar,
‫por exemplo, nesse tour, blá, blá, blá, não importa.
‫Então, se alguém entrar nisso, todo
‫esse espaço em branco no
‫final e no início aqui será cortado.
‫E, na verdade, podemos colocar a mesma coisa no nome,
‫por exemplo, aqui.
‫Ok, por que não?
‫Então, vamos deixar assim.
‫Aqui vejo que na verdade se chama duração,
‫não durações.
‫Tudo bem, então esse é o resumo, que também está incorreto.
‫Portanto, um resumo como este.
‫Ah, e sim, agora eu queria mostrar a
‫vocês o site Natours, na verdade.
‫Então, estamos de volta à nossa documentação do Mongoose.
‫Mas é isso que eu quero mostrar a você.
‫Então Natours. dev, que é o original deste aplicativo
‫e, portanto, esses são os dados que temos em nossa API
‫e que também precisamos, é claro, no banco de dados.
‫Portanto, temos todos esses dados.
‫Então, esse nome de passeio, temos a dificuldade, temos a duração, temos,
‫isso é um resumo, então temos um
‫local de início, temos a quantidade de locais, temos
‫uma data de início, temos
‫o tamanho máximo do
‫grupo em aqui, e temos que definir o
‫preço, a média da avaliação, a
‫quantidade da avaliação.
‫Também temos uma imagem aqui.
‫E aqui na página de detalhes é onde temos,
‫temos o resumo aqui embaixo.
‫Temos os guias que acabei de mostrar a vocês no Postman antes.
‫Temos mais algumas imagens.
‫Temos aqui todos os locais e
‫todos os comentários.
‫Ok, como eu estava dizendo a você, nem
‫todos os dados estão na página Visão geral e, portanto,
‫nem todos os dados também são necessários.
‫Ok, então vamos voltar aqui.
‫Em seguida, quero adicionar uma descrição.
‫E este é um tipo de String, e
‫vamos definir trim como true novamente.
‫E acabei de lembrar
‫que o resumo está na página Visão geral.
‫E então vamos tornar este obrigatório.
‫Então você adiciona aqui
‫no
‫final, é verdade, um tour deve ter uma descrição.
‫Ok, em seguida, especificaremos o imageCover.
‫Essas são as imagens que você vê na página de
‫visão geral e vamos definir esta para realmente exigir essa função.
‫Portanto, o tipo deve ser string, porque
‫basicamente este será simplesmente o nome
‫da imagem aqui, que
‫mais tarde poderemos ler do sistema de arquivos.
‫Ok, então realmente apenas o nome da imagem.
‫Basicamente, uma referência será armazenada no banco de dados.
‫E essa é uma prática muito comum, ok?
‫Portanto, poderíamos armazenar a imagem inteira também em um banco de dados, mas
‫isso geralmente não é uma boa ideia.
‫Simplesmente deixamos as imagens em algum lugar do sistema de arquivos e, em
‫seguida, colocamos o nome da própria imagem no banco
‫de dados como um campo.
‫Portanto, defina-o como obrigatório, é
‫verdade, um tour deve ter uma imagem de capa.
‫Legal, a próxima é o resto das imagens.
‫E agora aqui, temos algo novo, ok?
‫Porque temos várias
‫imagens e quero salvá-las como um array.
‫E, na verdade, como uma série de strings.
‫E a maneira de fazer isso
‫é simplificar e especificar aqui um array de strings, assim.
‫Então, eu quero que ainda seja do tipo string, mas
‫quero que seja um array.
‫Portanto, uma matriz na qual temos várias strings.
‫E é assim que posso definir isso, ok?
‫E usaremos isso mais tarde para outra coisa novamente.
‫Então, passaremos mais opções de
‫tipo de esquema do que apenas
‫um tipo, e então usaremos isso novamente, certo?
‫Por enquanto, vamos prosseguir, e
‫o próximo campo que gostaria de
‫adicionar aqui é createdAt.
‫E o campo createdAt deve ser basicamente um carimbo de
‫data / hora definido no momento em que o usuário obtém um novo tour.
‫Portanto, isso aqui deve ser adicionado automaticamente.
‫Novamente, no momento em que o passeio é criado.
‫Então, como fazemos isso?
‫Bem, em primeiro lugar, definimos o tipo como Data.
‫Portanto, Data é mais um tipo de dados integrado do JavaScript e, portanto,
‫podemos usá-lo aqui.
‫Ok, então o tipo é Date, e
‫então simplesmente precisamos definir um padrão, e
‫o padrão é a
‫função interna do JavaScript Date. agora.
‫E tenho certeza de que você está familiarizado com este.
‫Portanto, isso simplesmente nos dará um carimbo de data /
‫hora em milissegundos, que basicamente representa o milissegundo atual.
‫Certo, agora no
‫Mongo, isso agora é convertido imediatamente para a data
‫de hoje para dar mais sentido a esses dados, certo?
‫Então, sim, esse é o carimbo de data / hora criado automaticamente.
‫E agora, finalmente, precisamos também passar uma série de datas.
‫E agora, finalmente, para
‫terminar, também queremos definir um conjunto de datas de início.
‫Portanto, datas de início e, novamente, simplesmente definimos uma matriz e, em
‫seguida, dizemos que nela queremos as datas.
‫Tudo bem, então essas datas de início são basicamente datas diferentes
‫nas quais uma turnê começa.
‫Por exemplo, podemos ter uma turnê
‫começando em dezembro
‫deste ano e, em seguida, em fevereiro
‫do próximo ano, e então
‫outra no verão, e assim datas diferentes
‫para a mesma turnê são
‫simplesmente diferentes, digamos, instâncias da turnê começando em datas diferentes.
‫Tudo bem, espero que faça sentido.
‫De qualquer forma, este aqui não será
‫criado automaticamente pelo MongoDB, e o MongoDB tentará automaticamente
‫analisar a string que passamos como a data em
‫uma data JavaScript real.
‫Por exemplo, poderíamos transmitir algo
‫como digamos 2021, 21 de março, e novamente o
‫Mongo analisaria isso automaticamente
‫como uma data.
‫Você também pode especificar a data.
‫Por exemplo, dizer 11 e 32 minutos, certo.
‫Ou também poderíamos simplesmente inserir um carimbo de data / hora Unix, portanto,
‫um carimbo de data / hora como neste formato aqui.
‫Ok, e todos esses
‫formatos, basicamente, o Mongo tentará analisá-los em uma data.
‫E apenas se não puder, gerará um erro.
‫(exala) Então isso deu muito trabalho.
‫Vamos dar uma chance aqui.
‫E a maneira que podemos experimentar é ir
‫aqui para o nosso dev-data, onde temos
‫este tour simples. arquivo json,
‫que é o que usamos na seção anterior.
‫Tudo bem.
‫E então tudo
‫que vou fazer aqui é apenas pegar todos
‫esses dados aqui e, em seguida, usar esse para criar uma nova solicitação, certo?
‫Portanto, queremos criar uma nova solicitação POST aqui, e com
‫todos esses dados,
‫em vez de ter que escrevê-la manualmente.
‫Ok, então colando tudo isso aqui.
‫E agora, de fato, não precisamos do ID.
‫Então, precisávamos
‫disso antes, quando estávamos fazendo nossa API baseada
‫em arquivo, mas agora acabou, então vamos nos livrar disso.
‫E assim, todos
‫os outros dados que marcamos como necessários agora estão realmente
‫aqui, e ainda mais alguns.
‫Então, vamos tentar ver o que acontece quando enviarmos isso.
‫E agora recebemos dados inválidos enviados.
‫Então, vamos ao nosso controlador de tour e aqui, onde criamos
‫um tour, em vez desta mensagem, vamos
‫voltar como tínhamos feito antes e enviar
‫o erro completo para ver o que
‫está realmente acontecendo de errado.
‫Então mande aqui, ok, e o problema é que
‫já temos The Snow Adventure definido.
‫Então, primeiro vamos nos livrar disso.
‫Sim, então aqui temos
‫The Snow Adventure, então devemos deletar
‫isso, e para isso, estou usando nossa própria API,
‫então já podemos colocá-la em uso aqui.
‫Então, esse agora deve ter
‫desaparecido, e agora devemos ser capazes de adicionar isso como um novo passeio.
‫E, de fato, agora está aqui.
‫Então, aqui estão todos os dados que
‫acabamos de especificar neste formato agradável.
‫Então, o que é interessante agora é
‫realmente ver o timestamp createdAt.
‫Essa é a hora exata em que estou gravando este vídeo.
‫E então este foi criado automaticamente
‫por este trecho de código que temos em algum lugar aqui.
‫Sim, isso.
‫Então essa data está vindo desta Data. agora marca a hora
‫em que o JavaScript então analisa
‫automaticamente para esta data agradável e legível.
‫Então aqui temos essas matrizes.
‫Ok, então este array
‫e outro array e, claro, o ID gerado automaticamente, certo?
‫Então, se viermos aqui
‫agora, teremos, é claro, três tours.
‫Primeiro, os outros que não são tão completos
‫e depois todos esses.
‫O que é interessante de ver aqui
‫é que o Mongo também atualizou os passeios que já tínhamos.
‫Por exemplo, tínhamos classificação aqui,
‫mas agora que nosso esquema mudou
‫completamente, ele adicionou essa média de classificações
‫e também esta quantidade de classificações, ambos aos seus padrões, e
‫o mesmo aqui.
‫Ele também criou esse carimbo de data / hora.
‫Ele criou, sim, criou imagens e datas de início, com
‫essas matrizes vazias.
‫E isso meio que mudou todos esses dados aqui.
‫Tudo bem, e antes de prosseguirmos em um
‫projeto, provavelmente devemos ir
‫em frente e excluir todos esses dados aqui.
‫E, na verdade, o que faremos no
‫próximo vídeo, agora que nosso modelo está finalmente concluído,
‫pelo menos para
‫esta seção, seguiremos em frente e
‫escreveremos um pequeno script que importará automaticamente todos
‫os passeios desses dados JSON.
‫Ok, então a partir deste arquivo JSON, na verdade.
‫Basicamente, ele lerá o arquivo, obterá
‫todos os passeios e os importará para o banco de dados.
‫Tudo bem, é isso que faremos a seguir,
‫porque isso será extremamente útil nesta
‫seção e também no futuro.