‫-: Bem-vindo de volta ao próximo vídeo.
‫E vamos continuar agora com
‫um novo e avançado recurso do Mongoose
‫chamado 'Virtual Populate. 'Então,
‫no momento, nós preenchemos
‫os comentários com
‫o tour e os dados do usuário aqui, certo?
‫E assim, agora,
‫quando fazemos consultas sobre avaliações, temos acesso a essas informações.
‫No entanto, isso ainda deixa um problema sem solução.
‫Então, como vamos acessar as avaliações dos tours?
‫Então, basicamente, o contrário.
‫Então, digamos que eu fiz uma consulta sobre um tour específico.
‫E então, como
‫terei acesso a todas as avaliações desse tour?
‫E esse problema surge aqui
‫porque fizemos referência aos pais nos comentários.
‫Basicamente, ter os comentários apontando para os
‫passeios e não os passeios apontando para os comentários.
‫E assim, como dissemos no início da
‫seção, neste caso,
‫o pai realmente não sabe sobre seus filhos.
‫E assim, neste
‫exemplo, o tour não sabe sobre seus comentários.
‫E às vezes, tudo bem.
‫Mas, neste caso, nós realmente queremos que
‫a turnê saiba basicamente sobre todas as críticas que ela tem.
‫Agora, para resolver isso, com
‫o que sabemos
‫até agora, poderíamos ter duas soluções.
‫E a primeira seria consultar manualmente
‫os comentários cada vez que consultamos os passeios.
‫Mas seria um
‫pouco complicado fazê-lo manualmente assim.
‫E a segunda solução poderia ser também fazer
‫referência às crianças nos passeios.
‫Então, basicamente, mantenha uma matriz de
‫todos os IDs de revisão em cada documento de passeio.
‫Então, tudo o que
‫teríamos que fazer é preencher esse array, certo?
‫Mas, na verdade, já descartamos fazer
‫isso certo no início
‫porque não queremos armazenar aquela matriz
‫de IDs de revisão que
‫poderia crescer indefinidamente em nosso banco de dados, certo?
‫E é exatamente por isso que escolhemos a
‫referência aos pais em primeiro lugar.
‫No entanto, existe uma ótima solução para isso.
‫E isso porque o Mongoose realmente nos oferece uma
‫solução muito boa para esse problema
‫com um recurso bastante avançado chamado 'Virtual Populate. 'Portanto, com' Preenchimento virtual
‫', podemos
‫preencher o tour com comentários.
‫Em outras palavras,
‫podemos ter acesso a todas as avaliações de
‫um determinado tour, mas sem manter essa matriz de ID's no tour.
‫Portanto, pense em 'Preenchimento
‫Virtual' como uma maneira de manter essa matriz de IDs
‫de revisão em um tour, mas sem realmente persistir no banco de dados.
‫E então isso resolve o problema
‫que a gente tem com a referência de criança, né?
‫Então, é um pouco como campos virtuais, mas com populate, ok?
‫Então, apenas para ilustrar
‫isso, vamos ao nosso modelo de passeio aqui.
‫E assim, o que acabei
‫de descrever seria, em teoria, fazer algo assim.
‫Portanto, em nosso modelo de
‫tour, adicionaríamos um campo chamado 'Comentários. '(clique nas
‫teclas) E então defina o
‫tipo para Mongoose. Esquema. ObjectId.
‫(clicando nas teclas) E você
‫não precisa escrever isso.
‫Só estou fazendo isso para mostrar a você.
‫(clique nas teclas) E, em
‫seguida, conecte-o com 'Review. 'E, claro,
‫isso aqui teria que ser um objeto.
‫Mas, o que importa aqui é que
‫basicamente é assim que implementaríamos a referência à criança.
‫Então, o tour referenciando comentários, ok?
‫Mas, novamente, não queremos fazer isso.
‫Em vez disso, vamos implementar 'Virtual Populate. '(clicando nas
‫teclas) Tudo bem.
‫E funciona assim.
‫Então, fazemos isso aqui no esquema do tour.
‫(clique nas teclas) E ainda
‫fazemos isso. virtual.
‫Assim como com este campo virtual aqui,
‫semana de duração, então digitamos o nome do campo virtual.
‫Então, vamos chamá-lo
‫de 'Comentários' e, em seguida, um objeto de algumas opções.
‫E o primeiro é o
‫nome do modelo que queremos fazer referência.
‫E isso funciona exatamente como a referência normal.
‫(clicando nas teclas)
‫Novamente, o nome do modelo.
‫Portanto, 'Revisão' ou curso, neste caso.
‫E agora, realmente precisamos especificar o nome dos campos
‫para conectar os dois conjuntos de dados.
‫E esta é, para mim, a parte mais complicada de
‫implementar este 'Virtual Populate. - E então,
‫vamos ter certeza de que você realmente entendeu essa parte.
‫Então, aqui, precisamos especificar dois campos.
‫O campo estrangeiro e o campo local.
‫Portanto, comecemos com o campo estrangeiro.
‫E então, esse é o nome do campo no outro modelo.
‫Portanto, no modelo Review,
‫neste caso, onde a referência ao modelo atual é armazenada.
‫E isso é, nesse caso, o campo Tour, certo?
‫Então, vamos dar uma olhada nisso.
‫E então, novamente, em nosso modelo de revisão, temos
‫um campo chamado 'Tour. 'E é aqui
‫que o ID do tour está sendo armazenado.
‫E é por isso que
‫aqui, neste campo estrangeiro, especificamos aquele
‫nome daquele campo para conectar esses dois modelos, ok?
‫E agora precisamos fazer o mesmo para o modelo atual.
‫Portanto, precisamos dizer onde esse ID está realmente
‫armazenado aqui neste modelo de passeio atual.
‫Portanto, campo local.
‫E isso é, o ID.
‫Então, _ID, ok?
‫E então, novamente, este _ID, que é como
‫é chamado no modelo
‫local, é chamado de 'Tour' no modelo estrangeiro.
‫Portanto, no modelo Review. OK?
‫E, novamente, é assim que
‫conectamos esses dois modelos.
‫Vamos escrever aqui
‫que isso é 'Povoamento virtual', certo?
‫E agora, com esta configuração, podemos
‫realmente usar o Populate como fizemos antes.
‫E então o que queremos fazer
‫agora é ir em frente
‫e preencher a turnê quando temos apenas uma turnê, ok?
‫Então aqui no Postman, é nessa situação de 'Get Tour. ' OK?
‫Vamos ver se isso realmente existe.
‫E é, mas é uma viagem de teste esquisita.
‫E então, vamos realmente fazer isso com este 'Forest Hiker'.
‫Tudo bem.
‫Então, quando tivermos esse
‫tour, agora queremos preencher os comentários.
‫E já deve estar aqui como um array vazio.
‫Ah, aqui está.
‫Não é um array vazio, mas é definido como 'null. 'Mas o
‫campo virtual na verdade já
‫está lá com as avaliações.
‫Mas é nulo neste
‫ponto porque ainda não o populamos, certo?
‫E, novamente, queremos preenchê-lo aqui no
‫'Get One
‫Tour' e não em 'Get All Tours' porque
‫isso seria um pouco de informação
‫demais para enviar a um cliente quando ele obtiver todos os tours.
‫Além disso, quando estamos obtendo todos os
‫passeios, isso geralmente é para construir uma página de visão geral.
‫E, nesse caso,
‫geralmente não precisamos acessar todos os comentários.
‫Só precisamos disso quando
‫estamos realmente exibindo apenas um tour.
‫OK? E então, acho que
‫faz sentido apenas preencher isso no 'Get One Tour. 'Então, vamos
‫fazer isso preencher
‫bem no controlador.
‫Então, o controlador de tour e aqui
‫embaixo temos 'Get Tour. 'E então,
‫isso é realmente muito fácil.
‫Só falta chamar 'Preencher' após a
‫outra consulta, e então simplesmente passar o nome do
‫campo que queremos preencher.
‫E então, como já sabemos, isso se chama 'Comentários. - E,
‫na verdade, já deve ser isso.
‫Tudo bem?
‫Então, vamos testar isso agora e dar uma olhada nisso.
‫E, de fato, agora obtemos nossa análise completa aqui.
‫Tudo bem? Então isso foi povoado.
‫E isso significa que nosso Populate
‫Virtual está realmente funcionando.
‫Agora, você pode começar
‫a ver que isso está
‫criando uma espécie de problema porque aqui
‫está basicamente criando uma cadeia de habitantes.
‫E isso não é nem um pouco ideal.
‫Portanto, temos o tour preenchido com comentários.
‫Mas, então, os comentários também são
‫preenchidos com o tour novamente e também com o usuário.
‫E o passeio também está
‫ficando lotado de guias.
‫O que, neste caso, não está
‫acontecendo porque não há guias.
‫Mas se houvesse, teríamos ainda outra população.
‫E então aqui teríamos uma cadeia de três populações.
‫E, portanto, para desempenho, isso não é ideal de forma alguma.
‫Principalmente aqui com o tour.
‫Portanto, temos o tour preenchido com comentários.
‫E nas avaliações, voltamos a ter os dados do tour.
‫E isso não faz muito sentido.
‫Então, está uma bagunça agora.
‫PORTANTO, a solução que usarei
‫aqui é desativar
‫o preenchimento dos comentários com os passeios, certo?
‫Basicamente, não precisamos desses dados aqui em cada revisão.
‫Portanto, neste caso, acho que é uma boa solução.
‫Mas é claro, novamente no seu caso, sempre
‫dependerá de como seu
‫aplicativo funciona no seu caso específico.
‫Mas neste aplicativo, é mais lógico ter realmente
‫as avaliações disponíveis nos
‫passeios, e não é tão importante
‫ter o passeio disponível na avaliação, ok?
‫Então, vamos desligar esse preenchimento basicamente, no
‫modelo Review.
‫OK?
‫Então, vamos apenas comentar essa
‫parte, copiá-la
‫aqui, e basicamente nos livrar desta primeira.
‫Agora tudo bem?
‫Prepare-se para salvar.
‫Vamos tentar novamente.
‫E então, agora devemos ver apenas o ID do passeio aqui.
‫OK? E, de fato, é exatamente isso que obtemos.
‫OK? Agora, com
‫isso, é claro, ainda fazemos referência aos pais, certo?
‫Ainda mantemos uma referência aos passeios aqui,
‫mas simplesmente não a preenchemos.
‫E, novamente, porque nem
‫sempre precisamos desses dados aqui.
‫Tudo bem. Vamos recapitular rapidamente o que fizemos aqui.
‫Então, começamos a fazer apenas referências aos pais na revisão.
‫Mas isso fez com
‫que, nos passeios, não tivéssemos acesso às resenhas correspondentes.
‫E a solução mais fácil para
‫isso seria também fazer referências às crianças nos passeios.
‫Mas o problema com
‫isso seria que não queremos realmente
‫manter uma matriz de todos
‫os documentos filho no documento pai, certo?
‫Porque, novamente, não
‫queremos permitir que os arrays cresçam indefinidamente.
‫Então, em
‫vez de fazer isso, implementamos populates virtuais como este.
‫Tudo bem? Então, assim.
‫E isso nos permite basicamente fazer exatamente a mesma coisa.
‫Portanto, manter uma referência a todos os
‫documentos filho
‫no documento pai, mas sem realmente persistir essas
‫informações no banco de dados.
‫E então, depois de configurar esse
‫populate virtual, tudo o que precisamos fazer
‫é basicamente usar o Populate como fizemos antes com as referências reais.
‫E então, finalmente,
‫também desligamos um dos populates que tínhamos na revisão.
‫Então, este aqui, onde
‫preenchemos o ID do passeio, porque
‫isso estava criando uma cadeia ineficiente de preenchimentos.
‫E isso, é claro, é algo que não queremos.
‫E assim,
‫no final, acabamos com um resultado assim, ok?
‫Excelente.
‫Então, espero que tenha feito sentido para você.
‫E com
‫isso, encerramos por enquanto essa parte do povoamento, certo?
‫E agora vamos passar para o próximo
‫tópico, que basicamente é a criação de rotas aninhadas.