Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Como que faço uma procura passando dois req.query referenciando o mesmo campo de um array como se fosse em intervalos

Ao atribuir duas req.query para um mesmo campo do filtro para o array, ele pega somente a segunda , como que eu posso usar os dois req.query usando intervalos como procura ? exe: req.query.competencia_inicial = '201901' req.query.competencia_final = '201912'

searchMovement(req, res){
           try {
               const {tipo_evento, competencia_inicial, competencia_final } = req.query;
               const filtros = {};
                if(tipo_evento){
                    filtros['tipo_inscricao'] =  tipo_evento;
                }

               if(competencia_inicial){
                   filtros['competencia'] =  competencia_inicial
               }

               if(competencia_final){
                   filtros['competencia'] =  competencia_final
               }

               console.log('filtro', filtros);

               console.log('Iniciado Evento de Buscar Dados ..:', start);



               const filtroMovimento =  data.filter(movimento =>{
               let isValid = true;
               for (let key in filtros){                
                   console.log(key, movimento[key], filtros[key]);
                   isValid =  isValid && movimento[key] == filtros[key];

               }
               return isValid;
           });

           if(filtroMovimento.length){
               const movimento = filtroMovimento;
               console.log('Informações encontradas ..: ', start);
               res.json({ movimento });
           } else {
                console.log('Informações não encontradas ..: ', start);

                res.status(403).send({ error: 'Not Found!' });
           }
5 respostas

Boa tarde Thiago, tudo certo?

Saberia dizer de qual curso esse código se refere? Pois o comportamento de queries varia muito de acordo com o contexto.

Esse comportamento que você encontrou me parece adequado, pois a tendência é que cada consulta no banco de dados retorne um conjunto de dados, e se fizermos outra consulta e atribuirmos à mesma variável esse valor será sobrescrito.

Uma possível solução é buscar uma forma de fazer uma consulta já passando os dois valores como um intervalo. Algumas bibliotecas já implementam isso, vide o driver mysql. Sendo assim, recomendo buscar pela biblioteca/framework que você esteja utilizando e procurar por métodos específicos que são implementados para essa finalidade.

Caso queira, você pode compartilhar o seu projeto em um repositório público no GitHub e nos enviar o link aqui para que possamos contribuir com uma resposta mais específica.

Espero ter ajudado e bons estudos!

Olá João, esse código é referente a um projeto pessoal, na qual gostaria de testar um range de querys(exemplo req.query.dataInicial=202001 e req.query.dataFinal 202002) sendo um mesmo campo(competencia) em array (data.js fake) não usei banco de dados pois queria testar em array mesmo, e tentei usar o campo da query como alias para o campo verdadeiro. no momento estou estudando Angular e pretendo reciclar o meu conhecimento em Nodejs.

este daqui é meu código. https://github.com/tsilva19/movimento

Será que consigo usar a lib do mysql sem usar de fato banco de dados, porque a estrutura de query em relação ao range(intervalo) acho que me atende ?

solução!

Ah, acho que entendi agora!

Como estamos manipulando apenas arrays, podemos utilizar os métodos que o JavaScript já nos fornece. Um que veio em mente é o Array.filter(). Esse método pode ser aplicado em um array e ele recebe uma função que vai aplicar uma ou mais condições no array, e vai retornar outro array apenas com os valores que passaram esses testes. Você pode checar a documentação do MDN, mas vou deixar um exemplo aqui:

const resultados = dados.filter( (dado) => {
    if ( dado > 10 && dado < 15) {
        return true;
    }
        return false;
});

Mas como os dados provavelmente não serão armazenados ou disponibilizados dessa forma, realmente fica mais difícil utilizar uma solução do tipo em um projeto maior. Uma sugestão de banco que você já pode treinar sem ORM que é bem simples de instalar e utilizar é o sqlite, recomendo dar uma olhada.

Creio que não tenha uma forma de utilizar o pacote mysql sem ter um banco rodando, inclusive quando for utilizar esse banco de dados recomendo olhar o pacote npm alternativo chamado mysql2. Mas reforço que não é necessário se preocupar muito com essas questões, pois no curso de Node com ORM são abordados formas mais versáteis de fazer consultas em banco de dados.

Espero ter ajudado e bons estudos!

Tentei trocar o find pelo filter e passar a query diretamente , ele resulta undefined

 const filtroMovimento = data.find(movimento => 
                    movimento.competencia == competencia_inicial && 
                    movimento.competencia == competencia_final &&
                    movimento.tipo_inscricao == tipo_evento)

                console.log(filtroMovimento)

Muito obrigado isso vai me ajudar na logica que preciso.