‫Instrutor: Agora vamos usar um processo
‫chamado populate para realmente obter acesso aos
‫guias turísticos referenciados sempre que consultarmos um determinado passeio.
‫Então, no último vídeo, criamos uma
‫referência para o usuário, aqui nesse campo de guias,
‫bem no nosso modelo de passeio, certo?
‫E agora vamos usar populate para
‫basicamente substituir os campos que referenciamos
‫pelos dados reais relacionados.
‫E o resultado disso
‫parecerá que os dados sempre estiveram
‫embutidos, quando na verdade, como
‫sabemos, estão em uma coleção completamente diferente, ok?
‫Agora, o processo de preenchimento sempre acontece em uma consulta.
‫Vamos agora para o nosso controlador de
‫tour e, em seguida, direto para a função onde temos um único tour.
‫Então aqui, vamos fazer o tour.
‫E aqui está nossa consulta, certo?
‫Portanto, é aqui que construímos nossa consulta.
‫E agora tudo o que precisamos fazer é
‫adicionar o populate à consulta.
‫Então, preencha e depois o nome do campo que
‫realmente queremos preencher e
‫que é chamado de guias, ok?
‫E se você pensar bem, esse nome realmente faz sentido.
‫Então, queremos preencher basicamente para
‫preencher o campo chamado guias em nosso modelo.
‫Certo, então novamente, este campo de guias
‫contém apenas a referência.
‫e com populate vamos preencher com
‫os dados reais, tudo bem e novamente apenas na consulta
‫e não no banco de dados real, ok?
‫Então, isso é realmente tudo que precisamos fazer.
‫E agora vamos dar uma olhada no resultado, ok?
‫Então, esse é o id do passeio e vamos lembrar que é
‫assim que os guias estão certos agora, ok?
‫Mas se agora vamos fazer o tour e com essa
‫id, vamos esperar agora,
‫e de fato, aqui estão os dados sobre os guias.
‫Ok, então esses dois elementos que já tínhamos
‫nos guias, agora foram preenchidos com os dados reais.
‫E se agora dermos uma olhada em todos
‫os tours, vamos realmente nos livrar de algumas dessas coisas aqui.
‫Temos muitas coisas abertas aqui.
‫Então, se agora pegarmos todos os tours,
‫ok, vamos rolar até o final
‫onde o novo deve
‫estar e, aparentemente, agora está bom, oh, isso
‫é porque eu tenho esse filtro
‫aqui, vamos nos livrar dele, e agora eu tenho meu 10 resultados e na verdade
‫está bem aqui, então o novo tour de teste.
‫E agora você vê que aqui está de volta a
‫nos mostrar apenas os valores que estão realmente no banco de dados.
‫Então, vamos também confirmar isso aqui no Compass.
‫E então, de fato, como você pode ver, ainda
‫não temos os dados reais aqui no banco de dados, mas apenas os ids.
‫Ok, e é apenas essa etapa de preenchimento que
‫irá substituir esses ids pelos dados reais, ok?
‫E aqui, isso não acontece
‫bem porque não implementamos o populate
‫no manipulador de rotas get all tours.
‫Ok, agora deixe-me mostrar um pequeno truque que podemos
‫fazer com a função populate.
‫O que na verdade é apenas selecionar alguns campos.
‫Portanto, por exemplo, não estamos interessados nesta propriedade v aqui e também
‫não em passwordChangedAt right, então esse não é
‫o tipo de
‫dado que queremos sobre nossos guias turísticos.
‫E aqui em populate, podemos realmente especificar isso.
‫Então, ao invés de apenas passar
‫a string, podemos criar um objeto
‫de opções
‫e então podemos dizer, o caminho é
‫guias, então basicamente, o nome do campo que queremos substituir,
‫e então, como
‫de costume, podemos usar select , e menos, este
‫aqui e também o outro, então passwordChangedAt, é apenas mais
‫fácil de copiar, certo, então vamos alterá-lo
‫aqui e enviar novamente.
‫E esse é claro, não é o caminho
‫certo, desculpe por isso, acho que também usei antes, na verdade,
‫onde realmente queria mostrar este aqui,
‫certo, e sinto muito por isso, mas ainda o que
‫queremos nos livrar daqui é este V
‫e esta passwordChangedAt.
‫E já fizemos
‫isso, se enviarmos agora, é claro
‫que só receberemos os dados nos quais estamos interessados.
‫Certo, então esta função popular é
‫uma ferramenta absolutamente fundamental para trabalhar
‫com dados no Mongoose.
‫E, especialmente, é claro,
‫quando há relacionamentos entre os dados,
‫tudo bem, então você deve sempre saber exatamente como
‫e quando usá-los em seus próprios aplicativos.
‫E para treinarmos para isso, é claro que
‫o usaremos muitas vezes mais ao longo desta seção.
‫Agora, apenas uma coisa que quero que você
‫tenha em mente é que, nos bastidores, usar populate
‫ainda criará uma nova
‫consulta e, portanto, isso pode afetar seu desempenho.
‫Ok, é claro que se você fizer isso
‫apenas uma ou duas vezes e em um tipo de aplicativo pequeno,
‫essa pequena queda no desempenho não será grande coisa.
‫Mas em um aplicativo enorme, com toneladas de
‫população por todo o lugar, isso
‫pode realmente ter algum tipo de efeito, certo?
‫Portanto, apenas tenha isso em mente.
‫Ok, realmente faz sentido, porque de que outra forma
‫o Mongoose seria capaz de obter dados sobre
‫passeios e usuários ao mesmo tempo.
‫Ele precisa criar uma nova consulta basicamente
‫para poder criar essa conexão.
‫Ok e agora apenas para terminar isso,
‫vamos lembrar o que eu
‫mostrei a vocês que isso realmente não funcionou quando recebemos todos os tours.
‫Portanto, lembre-se de como, nessa situação, ainda simplesmente obtemos
‫os ids dos guias turísticos e não os
‫dados do usuário referenciados.
‫Ok, e uma solução seria basicamente copiar
‫esse código aqui, essa função popular, também aqui neste
‫manipulador de rota, mas é
‫claro, código duplicado nunca é uma boa ideia.
‫E espero que
‫você já saiba neste momento uma maneira melhor de fazer isso.
‫E a resposta é middleware de consulta.
‫Ok, então vamos avançar rapidamente e passar para o nosso modelo, e
‫estou copiando este código
‫aqui agora e então, sim, vamos fazer isso aqui.
‫Então,
‫um pré e, na verdade, como antes, faço isso
‫com uma expressão regular, que funcionará para
‫tudo que começa com find.
‫Então, assim,
‫ok, e é claro, fazemos isso no middleware de consulta, bem porque,
‫esse é o tipo de middleware
‫que será executado toda vez que houver uma consulta.
‫Certo, vamos apenas colocar todos esses middlewares pré-juntos
‫e, depois disso, ter o pós-um.
‫Tudo bem, deixe-me copiar o código que tínhamos antes e agora vamos
‫apenas adicioná-lo a isso, porque lembre-se
‫que no middleware de
‫consulta, isso sempre aponta para a consulta atual.
‫E agora, basicamente, todas as consultas
‫preencherão automaticamente o campo de guias
‫com o usuário referenciado.
‫Ok, agora podemos nos livrar dele aqui.
‫E sim, é realmente isso.
‫Portanto, agora fazemos isso aqui,
‫em vez de em dois lugares, no controlador.
‫E então este é um pequeno truque, caso você
‫sempre queira preencher todos os seus documentos.
‫Então, vamos testar.
‫Primeiro, se ainda funcionar aqui.
‫E realmente funciona, então temos nossos dois usuários.
‫E então vamos testar aqui onde não funcionou
‫antes e agora funciona, então aqui está o resultado disso.
‫E agora, apenas para ter certeza
‫de que realmente funciona, vamos atualizá-lo e basicamente adicionar outro guia turístico.
‫Então, vamos copiar o id do tour aqui e atualizar o tour,
‫então precisamos colocar o
‫id aqui, e então no corpo vamos pegá-lo em create tour,
‫então este
‫guia, e colocar isso aqui, e
‫então também precisamos pegar nosso outro usuário.
‫Então, é este aqui, que na verdade não é um
‫guia nem mesmo um administrador, mas ainda assim é apenas para
‫teste, então vamos pegar esse
‫id, e então ir em frente e colocá-lo aqui.
‫Então, vamos atualizá-lo, isso ainda funciona, e agora na
‫verdade, mesmo nesta
‫saída, já temos os dados preenchidos.
‫Ok, porque em nossa expressão regular lembre-se
‫de que usamos find.
‫E então, esta atualização aqui é implementada usando find by id
‫e update, e por isso também começa com
‫find e, portanto, o middleware de consulta que éramos antes
‫também se aplica a esta função.
‫Ok e então, é assim que o preenchimento funciona.
‫Ok, então novamente, ferramenta extremamente importante em sua caixa
‫de ferramentas do Mongoose, tudo bem.
‫E só para ter
‫certeza, vamos usar 15 segundos aqui para recapitular.
‫Portanto, este é um processo de duas etapas.
‫Primeiro, você cria uma referência a outro modelo.
‫E assim, com isso, você cria efetivamente
‫o relacionamento entre esses dois conjuntos de dados.
‫Em seguida, na segunda etapa, você preenche
‫o campo que acabou de
‫especificar antes, para orientar usando o método de preenchimento.
‫Tudo bem, muito simples, muito direto, tudo que você precisa é
‫realmente entender a lógica por
‫trás de tudo isso e então
‫você está pronto para realmente começar a usá-lo.