‫Palestrante: Agora vamos continuar trabalhando em nossa API.
‫Nos próximos vídeos, implementaremos
‫alguns recursos comuns da API
‫que tornam uma API mais fácil e mais agradável
‫de usar para quem a usará.
‫E nesta
‫palestra, vamos começar com a filtragem.
‫Então, novamente, o primeiro recurso que vamos implementar é permitir
‫que o usuário basicamente filtre os dados usando uma
‫string de consulta.
‫Deixe-me apenas dizer o que uma string de consulta está usando o Postman.
‫Então, vamos fechar todos esses caras.
‫Tudo bem.
‫Na verdade, onde a filtragem fará sentido é aqui
‫nesta rota para obter todos os passeios.
‫Pois, é esse que, assim como
‫o nome diz, fica com todos os passeios.
‫E aqui, queremos permitir que o usuário filtre os dados, de modo
‫que, em vez de obter todos os
‫dados, ele obtenha apenas os dados que correspondem ao filtro.
‫Assim, podemos basicamente permitir que o usuário consulte os
‫dados de uma forma muito fácil.
‫Novamente, usando a string de consulta.
‫E a string de consulta se parece um pouco com isso.
‫E tenho certeza que você viu.
‫Portanto, começamos com um ponto de interrogação e,
‫em seguida, podemos simplesmente especificar alguns pares de valores de campo.
‫Então, digamos que
‫quiséssemos filtrar por uma duração igual a cinco
‫e ao mesmo tempo, uma dificuldade fácil.
‫Portanto, podemos simplesmente construir uma string de consulta como esta.
‫Então, novamente, ele começa com este
‫ponto de interrogação, e então
‫podemos especificar quantos pares de valores-chave usando este formato.
‫E agora nosso aplicativo
‫Postman aqui realmente reconhece isso e
‫basicamente analisa essa string aqui e coloca
‫a chave e os valores aqui nesta guia Params.
‫Portanto, também podemos especificar a chave e os valores aqui.
‫Então, digamos que teste, defina-o para vinte e três, e você
‫verá aqui que ele realmente
‫o adicionou à string de consulta.
‫Essa é uma maneira muito legal do Postman nos ajudar aqui.
‫Porque agora podemos, por exemplo, enquanto estamos
‫fazendo testes, podemos ligar e desligar isso e você verá
‫que a string
‫de consulta aqui reage de acordo.
‫De qualquer forma, agora precisamos de uma forma de acessar esses dados que estão
‫em uma string de consulta, em nosso aplicativo Express.
‫Mas, felizmente para nós, isso é
‫muito fácil, porque o Express já cuidou disso.
‫Portanto, essa é apenas uma das muitas
‫coisas que o Express faz por nós para realmente tornar o
‫desenvolvimento do NodeJS muito mais rápido.
‫Então, deixe-me mostrar a você aqui, na verdade, no console.
‫Portanto, esses dados estão em uma solicitação, o que faz
‫sentido, e em um campo chamado consulta.
‫Portanto, a consulta de ponto de solicitação deve
‫nos fornecer um objeto bem formatado com os dados da
‫string de consulta.
‫Dê uma chance.
‫E observe como eu realmente
‫o adicionei à função de manipulador get all tours.
‫Então, novamente, fazemos esse tipo de filtragem na
‫rota onde queremos obter todos os passeios.
‫Vamos testar agora com esta string de consulta exata.
‫Enviou o pedido.
‫E voltando, aqui temos o objeto.
‫Na verdade, vamos tornar isso aqui maior para que
‫você possa ver.
‫Isso realmente não está funcionando.
‫Às vezes, sei que algumas pessoas não conseguem
‫ver a parte inferior da tela.
‫Deixe-me fazer de novo aqui.
‫E então, vamos lá.
‫Temos o objeto, que tem a duração definida em cinco
‫e a dificuldade definida como fácil.
‫E então você vê que o
‫Express, muito bem, analisou essa string neste objeto fácil de usar.
‫Agora, uma coisa que notei aqui é que
‫na verdade estamos perdendo o log
‫que tínhamos mais fácil aqui no console.
‫Vamos ver por que isso está acontecendo.
‫Portanto, por algum motivo, agora temos o aplicativo antes
‫de realmente lermos a variável de ambiente.
‫Dessa forma, o aplicativo não terá acesso a eles.
‫Eu pensei que já tinha corrigido isso antes, mas por algum
‫motivo ele está de volta agora.
‫Dê outro save aqui.
‫E vou tentar de novo.
‫Agora, recuperamos nosso registro.
‫Uma solicitação get para este URL e, em seguida, com
‫o restante dos dados aqui.
‫De qualquer forma, vamos agora
‫usar esses dados para implementar nossa filtragem.
‫Mas antes de fazermos isso, preciso dizer que
‫no Mongoose, existem duas maneiras de escrever consultas
‫de banco de dados.
‫O primeiro é usar apenas o objeto
‫de filtro, como fizemos na seção de introdução do MongoDB.
‫Direito? Lembre-se disso?
‫A segunda maneira é usar alguns métodos especiais do Mongoose.
‫Deixe-me, muito rapidamente, mostrar isso a você.
‫Com o objeto de filtro, faríamos assim.
‫Começamos com a descoberta aqui, e então podemos
‫passar um objeto de filtro.
‫E eu já mencionei isso antes.
‫Novamente, funciona exatamente da mesma maneira
‫que uma consulta MongoDB normal.
‫Podemos agora dizer que a duração
‫é cinco.
‫E
‫então, dificuldade, defina como fácil.
‫Essa é exatamente a string de consulta que tínhamos antes,
‫e agora estou codificando-a aqui apenas
‫para mostrar as duas maneiras diferentes de
‫escrever consultas no Mongoose.
‫Vamos testar esse aqui.
‫Você vê agora, só obtemos dois resultados.
‫Vamos nos dar um pouco de espaço aqui.
‫Tudo bem.
‫Vemos os dois resultados e, de fato,
‫ambos têm uma
‫duração de cinco, então aqui e aqui, e ambos são fáceis.
‫Fácil e fácil.
‫Portanto, nosso filtro funcionou bem.
‫Essa é a primeira maneira de escrever uma consulta.
‫Do jeito normal que já estamos acostumados, mas
‫tem outro jeito.
‫Deixe-me mostrar isso a você também.
‫Novamente, começamos exatamente da mesma maneira, mas
‫a diferença é que
‫começamos a encadear algum método especial do Mongoose
‫para basicamente construir a consulta semelhante a esta que temos.
‫Então dizemos,
‫onde
‫a duração
‫é igual a cinco.
‫Então também, onde a
‫dificuldade, que precisa
‫estar entre aspas, é
‫igual a
‫fácil.
‫Esta consulta aqui será exatamente
‫igual a esta, mas, novamente, escrita usando
‫métodos especiais do Mongoose.
‫E, claro, existem muitos outros métodos.
‫Por exemplo, em vez de iguais, podemos ter menos que, ou igual,
‫ou apenas menos que, ou você também pode classificar os
‫resultados ou limitar o número de resultados e, na verdade, todos
‫os tipos de coisas.
‫Com certeza, vamos usar alguns deles
‫nos próximos vídeos.
‫Isso pode parecer um pouco estranho para
‫você, mas na verdade é muito, muito útil em alguns casos.
‫Apenas para testar, tente novamente com este.
‫E, de fato, obtemos nossos mesmos dois resultados.
‫Agora, deixe-me comentar este aqui.
‫Vou deixar aqui apenas como
‫referência, porque agora vamos usar esse método aqui.
‫E vamos usá-lo, porque, na
‫verdade, já temos um objeto muito parecido
‫com este.
‫E essa é a consulta de ponto de solicitação.
‫Se você comparar, este objeto, a
‫este objeto que você vê aqui embaixo,
‫parece exatamente o mesmo que este.
‫Para implementar um filtro muito
‫simples, tudo o que temos que fazer neste caso é dizer, req dot query.
‫Vamos tentar mais uma vez.
‫Livre-se disso aqui.
‫E, de fato, obtemos exatamente os mesmos dois resultados.
‫Agora vamos tentar apenas com dificuldade definida como fácil.
‫Agora temos quatro resultados.
‫Todos eles, é claro,
‫terão a dificuldade definida como fácil.
‫Nosso filtro, nosso filtro básico, agora
‫está realmente funcionando.
‫Agora, o problema com essa
‫implementação é que, na verdade, é muito simples.
‫Isso porque, mais tarde, teremos
‫outros parâmetros de consulta.
‫Por exemplo, classificar, para funcionalidade de classificação,
‫ou página, para paginação.
‫Precisamos ter certeza de
‫que não estamos fazendo consultas em nosso banco de dados.
‫Por exemplo, se
‫adicionarmos aqui, página, igual a dois,
‫então, é claro, não obteríamos nenhum resultado.
‫Deixe-me mostrar isso para você.
‫E, de fato, não obtemos nenhum
‫resultado, porque não há nenhum documento nesta coleção
‫em que a página seja definida como dois.
‫Queremos apenas usar este parâmetro aqui, ou este
‫campo, página, para implementar a paginação e não para
‫realmente consultar o banco de dados.
‫Portanto, o que teremos
‫que fazer é excluir basicamente esses nomes de campo especiais
‫de nossa string de consulta antes de realmente fazer a filtragem.
‫Vamos agora implementar isso.
‫O que faremos é, primeiro, criar
‫uma cópia superficial do objeto de consulta de ponto de solicitação.
‫Vamos chamá-lo de objeto de consulta.
‫Aqui precisamos, realmente, de uma cópia impressa.
‫Não podemos simplesmente fazer, request dot query, porque
‫então, se você excluir
‫algo deste objeto, também o
‫excluiremos do objeto req dot query.
‫E isso porque
‫em JavaScript, quando definimos uma variável para outro objeto,
‫essa nova variável será basicamente apenas
‫uma referência a esse objeto original.
‫Então, realmente precisamos de uma cópia impressa aqui.
‫Em JavaScript, não há realmente uma maneira
‫embutida de fazer isso, mas um truque muito
‫bom que podemos usar, desde o ES6, é usar, primeiro, a estrutura que
‫usamos usando ponto ponto ponto.
‫E então podemos simplesmente criar um novo
‫objeto a partir disso.
‫Bem assim.
‫Essa estruturação aqui, esses três
‫pontos, basicamente tirará todos os campos do objeto.
‫Aqui, com as chaves,
‫bem, simplesmente criamos um novo objeto.
‫Portanto, temos um novo objeto que
‫basicamente conterá todos os pares de valores-chave
‫que estavam em nosso objeto de consulta de ponto req.
‫Então essa é uma cópia.
‫Agora vamos criar um array
‫de todos os campos que queremos excluir.
‫Estou chamando aquele de campos excluídos.
‫E então queremos excluir a página, então essa
‫é a que
‫eu disse antes no Postman.
‫Então, também queremos excluir
‫a classificação,
‫queremos excluir o
‫limite e queremos excluir os campos.
‫Implementaremos todas as funcionalidades de paginação,
‫classificação, limitação e seleção de apenas alguns
‫campos específicos, mais tarde nos próximos
‫dois vídeos.
‫Em seguida, o que precisamos fazer
‫é basicamente remover todos esses campos de nosso
‫objeto de consulta.
‫E para fazer isso,
‫faremos um loop sobre esses campos.
‫Portanto, campos
‫excluídos para cada um.
‫E estamos usando para cada
‫um porque não queremos salvar um novo array.
‫Então, para cada um desses
‫elementos, podemos usar o operador delete.
‫E então, do objeto
‫de consulta, queremos deletar o campo
‫com o nome do elemento,
‫portanto, o elemento atual na matriz.
‫Assim, primeiro deletaremos o campo da página, depois a
‫classificação, o limite e depois os campos.
‫Claro, apenas no caso de ele estar lá.
‫Se não houver, por exemplo, campo sem
‫limite, então, é claro, ele não será excluído, porque não
‫está lá.
‫Vamos agora dar uma olhada se isso realmente funciona.
‫Vou registrar a consulta req dot
‫e, ao mesmo tempo, o nosso objeto de consulta.
‫Dando uma chance a isso.
‫Não se preocupe com nossos resultados agora.
‫Só quero dar uma olhada em
‫nosso objeto de consulta, apenas para ter certeza de
‫que essa lógica que temos aqui realmente funciona.
‫Vamos adicionar aqui uma espécie de um e um limite de 10.
‫Isso fará mais sentido mais tarde.
‫Por enquanto, estou
‫apenas adicionando-os, para depois poder excluí-los.
‫Os resultados não importam, tudo o que importa,
‫é que nossa consulta original é este aqui, e então nosso
‫objeto de consulta, que é o
‫que vamos
‫usar, só tem dificuldade definida como fácil.
‫Isso porque excluímos, paginamos, classificamos e limitamos.
‫Isso agora funciona, então, em vez de
‫usar a consulta de ponto req, vamos usar nosso objeto de consulta.
‫Vamos nos livrar disso e tentar novamente.
‫Agora devemos voltar a
‫consultar todos os documentos que
‫apresentam dificuldade definida como fácil e ignorar todos esses outros campos.
‫Envie isso.
‫E, de fato, estamos de
‫volta aos nossos quatro resultados que tínhamos antes.
‫Também podemos ativar a duração e, de
‫fato, agora teremos dois resultados.
‫Lembre-se disso?
‫E se desligarmos isso, bem,
‫então é claro que vai funcionar da mesma forma.
‫Vamos apenas deletar esta linha vazia aqui.
‫E então, de fato, com nossa string de consulta original, as
‫coisas obviamente também funcionavam da mesma forma.
‫Preparamos nosso recurso de filtro para que
‫ele ignore os campos de página, classificação e limite.
‫Mas, na verdade, há algo
‫mais que precisamos fazer em nosso código, a fim
‫de basicamente sermos capazes de implementar esses recursos em vídeos futuros.
‫Vamos voltar aqui ao nosso código.
‫Portanto, agora vamos aprender
‫um pouco sobre como as consultas realmente funcionam no Mongoose.
‫Acho que mencionei isso
‫antes, mas é muito importante falar sobre isso novamente.
‫Este método de localização aqui irá retornar uma consulta.
‫Tudo isso aqui retornará uma consulta.
‫E é por isso
‫que podemos encadear outros métodos como este.
‫Como onde, é igual a e todos esses outros métodos
‫que falei com você antes.
‫Deixe-me mostrar isso para você na documentação novamente.
‫Aqui temos o objeto de
‫consulta e, novamente, quando usarmos o
‫método find, ele retornará um objeto que é uma consulta.
‫Portanto, no protótipo de ponto
‫de consulta, temos todos esses métodos.
‫Por exemplo, aqui temos onde, que acabei
‫de mencionar.
‫Temos classificar qual é
‫o que usaríamos mais tarde para classificar.
‫Temos, vamos ver, temos menos
‫ou menos que igual, temos maior.
‫Nós temos...
‫O que mais usamos?
‫Usamos iguais.
‫Todos eles fazem parte do protótipo de ponto de consulta.
‫Que, novamente, se refere a objetos
‫que estamos criando usando a classe de consulta.
‫Novamente, esta é a razão
‫pela qual podemos fazer esse tipo de encadeamento.
‫Agora vem a parte importante.
‫Assim que realmente aguardamos
‫o resultado da consulta, assim como
‫usamos await aqui ou aqui, por exemplo.
‫Assim que usarmos o await,
‫a consulta será executada e
‫retornará com os
‫documentos que realmente correspondem à nossa consulta.
‫Se fizermos assim, como temos aqui, agora há
‫uma maneira de, mais tarde,
‫implementar a classificação ou paginação, ou todos
‫esses outros recursos.
‫Em vez disso, o que
‫teremos que fazer, é salvar esta parte aqui em uma
‫consulta, então no final, assim que mudarmos todos os
‫métodos para a consulta que precisamos, só
‫então no final, podemos esperar que inquerir.
‫Por exemplo, vamos usar o método de classificação.
‫Vamos usar o método
‫de previsão, vamos usar o método de limite
‫e vamos usar, na verdade, um monte
‫de métodos e encadea-los a esta consulta.
‫Isso seria impossível
‫de fazer, novamente, se aguardarmos o resultado
‫dessa consulta inicial aqui, de imediato.
‫Espero que tenha feito sentido.
‫A forma como o faremos
‫é através
‫dos nossos tours por aqui.
‫E isso vai aguardar a consulta.
‫A consulta é, bem, simplesmente a
‫consulta sem qualquer espera.
‫Apenas para torná-lo consistente com esta
‫parte aqui,
‫vamos fazer assim.
‫Digamos que,
‫primeiro, construamos a consulta
‫e, em seguida, executemos a consulta.
‫Isso não é correto.
‫Já que estamos fazendo
‫comentários aqui,
‫digamos também enviar resposta.
‫Apenas para tornar nosso código um pouco mais fácil de digitalizar.
‫Espero que
‫tudo isso faça sentido, acabou sendo
‫um vídeo bem longo,
‫mas foi importante terminar essa parte
‫aqui explicando essa lógica aqui, para
‫que nos próximos vídeos possamos
‫implementar o resto dos recursos.
‫Porque, de novo,
‫sem ter assim, não funcionaria.