‫Narrador: Agora, outro recurso extremamente importante
‫de uma boa API é fornecer paginação.
‫Então basicamente permitindo que
‫o usuário selecione apenas uma determinada página de
‫nossos resultados, caso tenhamos muitos resultados.
‫Então, vamos fingir que temos,
‫por exemplo, 1000 documentos em uma determinada coleção.
‫E dizemos que em cada página temos 100 documentos.
‫Isso significaria que teríamos 10 páginas, certo?
‫Portanto, 10 vezes 100 é 1000.
‫E, com base nisso, como vamos implementar a paginação
‫usando uma string de consulta?
‫Bem, vamos usar os campos de página e delimitar.
‫Portanto, haverá um campo de página.
‫Digamos que queremos a página dois e
‫haverá um campo de limite.
‫E esse limite aqui basicamente significa a quantidade
‫de resultados que queremos por página.
‫E isso está definido aqui para apenas 10 e,
‫claro, temos que corrigir este aqui.
‫Não é uma vírgula, mas um e.
‫Então, página dois e o limite 10.
‫Agora voltando ao exemplo de 1000 resultados, se
‫o limite é 10, então apenas 10 resultados por
‫página, bem, então teremos 100
‫páginas e aqui estamos exibindo a página número
‫2 dessas 100 páginas.
‫OK?
‫Agora, precisamos agora de uma maneira de implementar isso usando o Mongoose.
‫Então, vamos dar uma olhada em como poderíamos fazer
‫isso voltando ao nosso código.
‫Portanto, o recurso número
‫quatro, Paginação.
‫Tudo bem,
‫e começarei criando um exemplo de
‫consulta aqui, como fizemos antes.
‫Então, digamos que a consulta seja igual à consulta.
‫E agora, que tipo de métodos
‫temos para implementar a paginação?
‫Bem, o mais útil é pular e vou
‫explicar o que ele faz em um segundo, então
‫vamos colocar um número aleatório aqui.
‫Então pule e limite, e vamos
‫colocar 10.
‫e, portanto, este limite aqui é exatamente o mesmo que
‫o limite que definimos na string de consulta.
‫Então, basicamente, a quantidade de resultados
‫que queremos na consulta.
‫E o salto, que temos aqui, é a quantidade de resultados
‫que deve ser ignorada antes de realmente consultar os dados.
‫Tudo bem, então, novamente, este é apenas um espaço reservado aqui.
‫Vamos voltar a este exemplo que temos aqui.
‫Vou apenas copiar esta string de consulta aqui.
‫então, digamos que o usuário queira a página número
‫dois com 10 resultados por página.
‫Isso significa que os resultados de um a 10 estão na página um e
‫os de 11 a 20 estão na página 2.
‫Ok, então o que isso significa é que queremos pular
‫10 resultados antes de realmente começar a consultar.
‫OK.
‫Portanto, novamente, um a 10 são
‫para a página um e
‫11 a 20 são para a página
‫dois, e
‫assim por diante.
‫Assim, 21 a 30 será a página três, e assim por diante
‫e assim por diante.
‫E então precisamos pular
‫10 resultados para chegar ao resultado número 11, certo?
‫Então, para o resultado número 11, que será o primeiro da página dois.
‫Ok, e como é a página dois que foi solicitada,
‫bem, novamente precisamos pular 10 resultados antes de
‫realmente iniciarmos a página dois.
‫OK? Faz sentido?
‫E, por exemplo, se solicitássemos a página número três, bem,
‫então, é claro, 20 resultados primeiro
‫teriam que ser ignorados.
‫E, portanto, precisaremos
‫calcular esse valor de salto aqui.
‫Basicamente, com base na página e no limite.
‫Agora você pode perguntar por que eu não peço diretamente o
‫valor de salto na string de consulta,
‫mas isso é porque para o usuário esse valor
‫aqui é meio abstrato, certo?
‫É muito mais fácil simplesmente dizer: "Bem, eu quero a página número um", ou quero
‫a página número cinco "ou quero
‫a página número 10. “Ok, então
‫para o usuário é muito mais fácil não lidar
‫com pular valores aqui e todas
‫essas coisas, o usuário quer que seja fácil
‫e apenas definir uma página.
‫Agora, antes de realmente começarmos
‫a calcular o valor de salto, precisamos primeiro obter a página
‫e o limite da string de
‫consulta e também devemos definir alguns valores padrão.
‫Ok, isso é basicamente
‫porque ainda queremos paginação, mesmo
‫que o usuário não especifique nenhuma
‫página ou limite.
‫Porque, por exemplo, digamos que temos um milhão de
‫resultados em nosso banco
‫de dados e, claro, quando o usuário
‫fizer a solicitação, não mostraremos simplesmente todos esses 10 milhões de resultados.
‫Isso não seria muito amigável, não é?
‫E então, vou definir por padrão a página número um
‫e um limite de, digamos, 100.
‫Então, por padrão, quando um usuário solicita todos os
‫tours neste exemplo, ele obtém apenas 100,
‫e não um milhão, certo?
‫Portanto, a página é, obviamente, um pedido. inquerir. página e agora
‫vou multiplicá-lo por um, que é apenas
‫um bom truque para converter uma
‫string em um número.
‫Ok, então talvez você tenha notado antes que cada vez que
‫colocamos um número em uma string
‫de consulta, ele será uma string ou um objeto
‫de consulta e, portanto, precisamos consertar isso simplesmente multiplicando por um.
‫Ok, e por padrão, queremos a página número um.
‫Tudo bem?
‫E, portanto, esta é uma boa
‫maneira em JavaScript de definir basicamente os valores padrão.
‫E tenho certeza que você está familiarizado com isso, certo?
‫De qualquer forma, o limite está na solicitação. inquerir. limite vezes
‫um novamente para convertê-lo, ou
‫o padrão de 100 que acabamos de mencionar.
‫O ideal é que o usuário apenas especifique o número da página
‫que solicita e
‫nem se preocupe com o limite de páginas.
‫Isso é para casos de uso mais específicos.
‫Ok, e agora tudo o que precisamos fazer é definir então para
‫calcular basicamente o
‫valor de salto que acabamos de falar aqui antes.
‫E a melhor maneira de fazer isso é voltar a um exemplo.
‫Então, novamente, digamos que estejamos solicitando a página número três, com
‫o limite de 10.
‫e vemos aqui para a página número três os resultados são
‫de 21 a 30.
‫Portanto, começa no resultado número 21, o que significa que
‫precisamos pular 20 resultados.
‫E 20 resultados são basicamente duas vezes 10,
‫ou seja, duas vezes esse limite.
‫Ok, e a partir daí começamos a obter uma fórmula.
‫Portanto, duas vezes dez é basicamente três menos um vezes 10.
‫E três é a página em que estamos.
‫Essa é a nossa fórmula.
‫Então, a página menos um
‫e a página anterior, basicamente,
‫vezes o
‫limite.
‫Ok, então espero que faça sentido, agora
‫vamos substituir esses valores aqui.
‫Saltar
‫e limite de limite.
‫OK?
‫Então, basicamente, este número aqui são todos os resultados que
‫vêm antes da página que estamos solicitando agora.
‫Então, novamente, se estivermos solicitando a página número três,
‫nossos resultados começarão na página número 21.
‫E queremos pular 20 resultados antes disso.
‫E 20 resultados
‫é porque temos 2 páginas e 10
‫resultados em cada. Sim, será a página que solicitamos.
‫Então, página aqui, menos um, então
‫a página anterior vezes o número de resultados em
‫cada página.
‫Ok, então essa é a quantidade de documentos
‫que serão ignorados.
‫Ok, então espero que faça sentido.
‫Vamos agora tentar realmente isso.
‫E como temos poucos resultados aqui, precisamos
‫testá-lo com um limite muito pequeno.
‫Então, digamos que desejamos apenas três resultados por página e, na verdade,
‫vamos começar na página número um.
‫Portanto, envie-o e, de fato, agora só obteremos três
‫resultados, como você pode ver aqui.
‫Então, esses três, vamos ver.
‫Assim, The Forest Hiker, The
‫Sea Explorer e The
‫City Wanderer.
‫OK?
‫Vamos tentar a página número dois e,
‫por algum motivo, o carteiro fica pulando de um lado
‫para o outro toda vez que eu mudo o URL.
‫De qualquer forma, agora temos The Park
‫Camper, The Snow
‫Adventurer e The Sports Lover.
‫Então você começa a
‫ver que agora temos tours diferentes.
‫OK?
‫E então podemos dizer que nossa paginação
‫aqui já está funcionando.
‫Agora a última página,
‫e temos agora As Luzes do Norte,
‫O Provador de
‫Vinhos e O Gazer Estelar.
‫Tudo bem?
‫Agora, e se tentarmos ir para a página quatro?
‫Já sabemos que temos apenas nove
‫tours e, portanto, na página quatro, não deve haver nada.
‫Direito?
‫Então, vamos testar isso.
‫E, de fato, obtemos zero resultados.
‫Mas é claro que isso não é o ideal.
‫Ok, então vamos agora corrigir isso e basicamente
‫lançar um erro cada vez que o usuário
‫selecionar uma página que não existe.
‫Porque essa é basicamente a situação aqui.
‫O usuário solicitou uma página que simplesmente não existe.
‫Não temos resultados suficientes para ter quatro páginas com
‫três resultados.
‫Vamos agora fazer isso, e
‫isso realmente só
‫acontecerá quando houver uma página na
‫consulta e, portanto, vamos criar essa instrução if aqui.
‫Então, se pedido. inquerir. página, somente neste
‫caso iremos testar se estamos pulando mais
‫tours do que realmente temos.
‫Então, vamos ver a quantidade de tours.
‫Portanto, o número de passeios é igual a, e agora
‫vamos aprender um novo método.
‫Portanto, há um novo método
‫no modelo Tour que é chamado countDocuments.
‫OK? E como o nome
‫diz isso vai devolver a quantidade de documentos, certo?
‫Na verdade ele vai retornar uma promessa
‫mas depois aguardamos a promessa
‫e então ele voltará
‫com o resultado da quantidade de tours.
‫OK? E se o número de documentos
‫que pulamos for maior do que o número de documentos
‫que realmente existem bem, isso significa que a página não existe, certo?
‫Isso faz sentido?
‫Portanto, se o salto for maior do que o
‫número de passeios, por
‫enquanto, o que farei aqui é lançar um novo erro.
‫OK?
‫Portanto, lance um
‫novo erro, esta página não existe.
‫Agora, por que estou jogando um erro aqui?
‫Bem, simplesmente porque se eu lançar um
‫erro aqui no tribloco em que estamos atualmente,
‫ele irá
‫automaticamente e imediatamente passar para o bloco catch,
‫e então enviará de volta este tipo 404 de mensagem de falha.
‫OK?
‫E é isso que queremos agora.
‫Lembre-se de que implementaremos um tratamento de erros muito melhor
‫um pouco mais adiante no curso.
‫E, na verdade, na próxima seção, ok?
‫Mas, por enquanto, vamos manter as
‫coisas simples, lançar este erro
‫aqui, caso estejamos tentando pular mais documentos do
‫que realmente temos.
‫OK?
‫Então esse é o caso certo, vamos enviar aqui
‫e esse não é o resultado que eu
‫esperava, então vamos voltar
‫então agora nossa página é quatro
‫e o limite é três.
‫Então o salto aqui seria três vezes três, então nove, ok?
‫E o número de passeios também é nove e,
‫portanto, ignorar não é maior do que o número de passeios
‫e, portanto, não recebemos esse erro.
‫Portanto, o que precisamos fazer é defini-lo como maior ou igual.
‫Ok, isso agora deve funcionar.
‫E isso leva muito tempo, e
‫demorou.
‫Agora temos o status de falha aqui e
‫um 404.
‫Por alguma
‫razão, esse erro não está aparecendo aqui,
‫o que realmente deveria.
‫Mas não se preocupe com isso, isso não é realmente importante.
‫O que importa é que ele realmente entrou em nosso bloco catch
‫e, em seguida, enviou de volta esta resposta 404.
‫Tudo o resto vamos implementar um pouco mais tarde.
‫Ok, e é isso mesmo.
‫Esses são todos os métodos que adicionaremos à nossa
‫consulta e, quando finalmente alcançarmos a próxima linha de
‫código aqui, nossa consulta
‫será aguardada e retornada com os passeios.
‫Ok, e neste ponto nossa consulta pode realmente
‫parecer algo assim
‫algo assim, algo como bem
‫o
‫que temos aqui temos sort,
‫select, então podemos
‫ter sort, e então
‫algum select ali também
‫temos skip
‫temos limite também, e
‫essa é realmente uma grande consulta.
‫E novamente, o que nos permite isso
‫é que cada um desses métodos aqui sempre retornará
‫uma nova consulta que podemos então encadear no
‫próximo método
‫e no próximo método, e no próximo método até que finalmente
‫esperemos a consulta para que possa realmente nos dê nossos documentos.
‫Ok, então vamos nos livrar de todos esses comentários
‫e sim, é isso por agora.
‫Para esses recursos, vamos adicionar mais um
‫na próxima aula,
‫mas esse será um pouco diferente desses.
‫Não vai usar um desses métodos de consulta, certo?
‫Portanto, espero que nas últimas duas palestras você
‫tenha realmente aprendido os meandros
‫da consulta de dados com o Mongoose.
‫Então, é claro, todos esses métodos que usamos
‫não são úteis apenas para os recursos que implementamos aqui.
‫Você pode realmente criar todos os tipos
‫de consultas que você pode imaginar para todos os tipos de aplicativos.
‫Então, mostrei a você todas as técnicas neste
‫contexto desses diferentes recursos de API,
‫mas é claro que você
‫poderá usá-las em todos os seus aplicativos no futuro, certo?
‫Espero que tenha sido divertido
‫para você e, se foi, vamos prosseguir agora para o próximo.
‫Vê você!