‫-: Então, o recurso
‫de filtro que implementamos agora já funciona muito
‫bem, mas neste vídeo, queremos levá-lo para o próximo
‫nível, permitindo algumas consultas ainda mais complexas.
‫Portanto, agora um usuário só pode filtrar
‫os documentos definindo uma chave igual a um valor, certo?
‫Mas agora, queremos também
‫implementar os operadores maior que, maior ou
‫igual a, menor que e menor ou igual a.
‫Então, em vez de
‫apenas ter igual, queremos realmente ser capazes de, por
‫exemplo, dizer duração maior ou igual a
‫cinco, e não apenas igual, certo?
‫E isso torna tudo um pouco mais complexo.
‫Agora, antes de escrever qualquer código, farei
‫o exercício de escrever a consulta como
‫ela deve ser no MongoDB.
‫Então, qual seria a aparência real do objeto de filtro?
‫E vamos escrever aqui como um comentário,
‫e novamente, apenas como um exercício.
‫O objeto ficaria um pouco
‫assim, dificuldade, comece com aquele, defina como fácil e
‫depois a duração; e agora lembre-se que
‫quando queremos usar um operador, precisamos iniciar outro objeto.
‫E então para o operador maior ou
‫igual a nós usamos assim, para cinco, certo, lembra disso?
‫Portanto, é assim que escreveríamos manualmente o
‫objeto de filtro para a consulta que acabamos de especificar.
‫Agora, na verdade, vamos voltar ao Postman
‫para que eu possa mostrar a você um meio padrão
‫de escrever uma string de consulta incluindo esses operadores.
‫E fazemos assim, então antes do sinal de
‫igual abrimos os colchetes e
‫aqui escrevemos o operador, então neste
‫caso maior ou igual, e pronto.
‫E então, basicamente assim, adicionamos uma terceira parte ao
‫par de valores-chave, então temos a
‫chave, o valor e agora também o operador.
‫E usamos novamente esses colchetes
‫para especificar o operador.
‫Então, novamente, essa é uma forma
‫padrão e vamos
‫agora realmente dar uma olhada na string de consulta que
‫o Express nos fornece e,
‫assim como antes, vamos realmente registrar
‫uma consulta reg dot no console, log reg dot query, tudo direito.
‫E então vamos dar uma olhada como nosso objeto
‫de consulta se parecerá quando
‫especificarmos a string de consulta desta forma.
‫Tudo bem, agora a primeira coisa que você percebe
‫é que obtemos um erro aqui,
‫mas não se preocupe com isso por enquanto.
‫Então, o que estou interessado aqui é este objeto, então deixe-me
‫ir em frente e copiá-lo aqui.
‫Tudo bem, então o que você nota aqui?
‫Bem, o que vemos aqui é que o
‫objeto de consulta parece quase idêntico
‫ao objeto de filtro que escrevemos manualmente,
‫a única diferença é que neste aqui temos o sinal do operador MongoDB.
‫Então, essa é realmente a única
‫coisa que falta aqui na frente do nome do operador.
‫Ok, então a solução
‫para isso é basicamente substituir todos
‫os operadores como esse por
‫seus operadores MongoDB correspondentes, basicamente adicionando este cifrão aqui, ok.
‫Então, agora vamos implementar isso e, de
‫fato, faremos em algum lugar aqui, vamos
‫adicionar mais alguns comentários aqui.
‫Filtrando que fizemos na última aula, agora vamos
‫adicionar alguns filtros avançados, e esse é
‫o código que vamos escrever agora.
‫Agora vamos colocar este código aqui no topo, certo.
‫Então, não precisamos desse código aqui, mas ainda
‫quero mantê-lo aqui,
‫então vamos colocá-lo aqui no final.
‫E então apenas este código aqui como uma referência apenas para ter
‫certeza de que sabemos o que estamos fazendo aqui.
‫Tudo bem, e agora que sabemos o
‫que precisamos fazer aqui, na
‫verdade é apenas um simples problema de Javascript.
‫E a maneira como estou resolvendo
‫é a seguinte, então primeiro vou converter o objeto em uma
‫string de forma que a string de consulta seja igual a stringify ponto JSON do objeto de
‫consulta, e agora posso usar essa string de consulta para
‫usar a função de substituição nela .
‫Tudo bem, então o que eu
‫quero substituir agora é o gte com o cifrão gte
‫e também alguma outra operadora.
‫Portanto, aqueles que
‫queremos substituir são maiores ou iguais,
‫maiores, menores ou iguais e menores, e há algumas
‫maneiras de fazer isso, mas
‫vou usar uma expressão regular.
‫E para mim, pessoalmente, as expressões regulares são
‫um dos conceitos mais difíceis em Javascript e,
‫na verdade, em geral na programação.
‫Então, geralmente, quando preciso fazer
‫algo assim, simplesmente vou para o Stack Overflow ou simplesmente
‫Google para encontrar a solução certa para
‫o problema que estou tentando resolver.
‫E então o que
‫queremos fazer agora é basicamente combinar uma dessas quatro palavras e,
‫em seguida, substituí-la pelas mesmas palavras,
‫mas com o cifrão na frente.
‫E então a
‫expressão regular para encontrar uma dessas quatro palavras é
‫assim; então abrimos esses parênteses e escrevemos os operadores,
‫então gte ou gt ou lte ou lt.
‫E então também precisamos adicionar este \ b antes e depois, e isso
‫porque queremos apenas corresponder essas palavras exatas.
‫Então, imagine que há uma palavra que contém
‫lt, então é claro que não
‫queremos corresponder a que queremos apenas se for esta palavra
‫exata, sem qualquer outra string ao redor dela.
‫E esta expressão regular que tenho aqui
‫cuidará disso e, na verdade,
‫há uma peça faltando e é esse sinalizador g aqui, o
‫que significa que na verdade acontecerá várias vezes.
‫Portanto, se tivermos dois ou três
‫operadores ou mesmo todos eles, ele substituirá todos eles.
‫E sem esse g aqui,
‫ele apenas substituiria a primeira ocorrência, então este é muito importante.
‫Agora, com o que realmente queremos substituí-lo?
‫Bem, o método replace na
‫verdade aceita um retorno de chamada que é muito poderoso, e
‫esse retorno de chamada tem como primeiro
‫argumento a palavra correspondida ou a string correspondida.
‫Portanto, podemos passar a correspondência para essa função de retorno de
‫chamada e o que retornamos desse retorno de chamada é
‫a nova string que substituirá a antiga, certo?
‫Então, vamos fazer uma string de modelo
‫aqui, e queremos
‫substituir a correspondência por uma correspondência de cifrão, ok, esta é aqui a
‫parte da sintaxe da string de modelo.
‫Então, esta aqui é essa correspondência, e queremos
‫colocar o cifrão na frente disso.
‫E agora, apenas para ter certeza,
‫vamos realmente registrá-lo no console e realmente querer o objeto de
‫volta, então o ponto JSON analisa a string de consulta.
‫Tudo bem, deixe-me prosseguir e limpar isso aqui para que
‫você possa ver os resultados um pouco melhor.
‫Então, novamente, recebemos esse erro
‫aqui e isso é claro porque o MongoDB
‫não pode realmente usar a string de
‫consulta ou o objeto de consulta como o temos agora.
‫E aqui temos os dois
‫resultados e você pode ver que nosso resultado é
‫exatamente o mesmo de antes e,
‫portanto, algo claramente não está funcionando.
‫Então, vamos tentar descobrir o que é.
‫E aqui a expressão regular parece bem, tudo parece bem
‫aqui, ah, mas tudo bem, o problema
‫é que estou substituindo-a na string, mas não a estou
‫salvando em lugar nenhum.
‫E então, na verdade, queremos salvá-lo de volta na string de consulta.
‫Então, vamos mudar isso
‫aqui para let, para que ele
‫possa alterar os dados e, digamos, string de consulta, desculpe.
‫Portanto, a string de consulta é igual à string de consulta substituída, assim
‫como antes, então o que eu estava esquecendo é simplesmente salvar
‫o resultado aqui de volta na variável.
‫Vamos tentar de novo e agora está funcionando.
‫Agora temos o
‫cifrão na frente da operadora, ótimo.
‫Ok, então funciona, vamos nos livrar desses comentários aqui e agora, finalmente,
‫tudo o que temos que fazer é
‫realmente não usar o objeto de consulta aqui, mas apenas usá-lo.
‫Então JSON. analise a string de
‫consulta e, claro, se você não tiver nenhum operador na
‫string de consulta, tudo funcionará perfeitamente.
‫Ele simplesmente não encontrará nenhum desses quatro operadores lá, mas não há
‫problema, ele simplesmente não substituirá
‫nada.
‫E também vamos tentar fazer isso e está demorando
‫um pouco, mas na verdade
‫ele voltou com três
‫resultados, então vamos verificar se eles estão realmente corretos.
‫Então a duração deve ser maior ou igual
‫a cinco, e este aqui tem duração de
‫cinco, isso tem duração de nove,
‫que é maior ou igual a
‫cinco, e está realmente funcionando, a dificuldade ainda é fácil e
‫daí o que isso significa que o código que acabamos de
‫implementar funciona muito bem.
‫Perfeito, agora vamos apenas por diversão adicionar
‫outro parâmetro lá, então vamos filtrar
‫pelo preço agora também.
‫Este aqui tem quase 2.000, depois 1100, este aqui tem 300.
‫Portanto, vamos filtrar por preços inferiores a mil ou
‫menos de mil e quinhentos.
‫E o preço, e agora novamente nossos suportes,
‫e usamos menos de 1500, e tudo bem, envie isso.
‫E o que temos aqui, oh, agora só temos dois resultados.
‫E, de fato, os preços aqui, 397, e aqui 1197, e então o
‫anterior a isso era de 2.000 agora se foi.
‫Então, filtramos esse também usando
‫novamente o operador que acabamos de implementar.
‫E agora poderíamos filtrar todos
‫os tipos de coisas aqui, mas você entendeu, então,
‫sim, implementamos nosso tipo de filtragem avançada
‫aqui neste ponto, que agora aceita até mesmo esses quatro operadores.
‫Agora, no mundo real, teríamos
‫então que escrever alguma documentação, basicamente para
‫permitir ao usuário saber quais tipos de
‫operação ele pode fazer em nossa API, certo?
‫Então, novamente, o ideal seria documentar completamente nossa API, especificando
‫quais solicitações podem ser feitas usando quais métodos
‫htp e também que tipo de filtragem
‫ou classificação, ou todos esses
‫recursos, quais deles estão disponíveis e como eles
‫podem usá-los, certo ?
‫Agora, em nosso caso, é claro que não faremos
‫isso, mas, novamente, não se esqueça que se
‫você está realmente implementando uma API que será usada por
‫outra pessoa, então você realmente deve fazer esse tipo de documentação.
‫De qualquer forma, vamos agora passar para o nosso próximo
‫vídeo e implementar uma funcionalidade de classificação.