1
resposta

Query String parameters

Olá, gostaria de saber como eu opero com as query strings exemplo tenho em meu mongodb e meu back rodando com node js . A parte de consultar está correta desejo que retornem valores maiores exemplo : localhost:9000/campaigns?dtEnd=>2020-05-30T05:55:23.406Z

Dentro de campaigns quero que retorne as campanhas com as datas de término maiores que a data que passei como parâmetro .

1 resposta

Olá Marcelo, tudo bem com você?

Acredito que já tenha encontrado a solução, caso não irei te mostrar uma alternativa (um tanto quanto rústica) para fazer isso :)

Para simular seus dados, eu criei um pequeno banco como seguinte formato:

  • nome: blog
  • collection: user
  • tipo de dado:
{
    _id: "43232321",
    name: "Usuario",
    idade: 30,
    createdAt: "2020-05-29"
}

Como o que você está querendo fazer é uma busca por data, teremos o mesmo resultado, só não irei me atentar com as conexões com o mongo, ok?

A primeira coisa que precisamos é utilizar o atributo query que temos dentro do res:

app.post("/campaigns", (req, res) => {
    const { dtEnd } = req.query;

Veja que eu estou desestruturando todos parâmetros da query para pegar apenas o dtEnd, dando um console.log teremos certinho:

>2020-05-30T05:55:23.406Z 

Agora irei fazer 2 coisas:

  • Pegar o operador que queremos

Para fazer a comparação com datas utilizando o mongodb, temos que utilizar os operadores atômicos $gt, $lt, então irei fazer uma simples comparação:

const operador = dtEnd[0] === ">" ? "$gt" : "$lt";

Veja que aqui também poderíamos fazer uma verificação se existe ou não o símbolo na query, mas para ficar mais simples irei assumir que sim :)

Observe que eu estou permitindo uma busca mais geral, tanto para datas maiores, ou menores, caso você quisesse apenas maiores poderia pular essa parte :)

  • Pegar a data

Aqui só irei tirar o símbolo do operador e transformar normalmente

const data = new Date( dtEnd.slice(1));

Agora já temos tudo que precisamos para fazer o find :)

    MongoClient.connect(uri, (err, client) => {
        if (err) throw new Error("Houve problema em realizar a conexão!");

        const blog = client.db("blog").collection("user");

        blog.find({
            "createdAt": {
                [operador]: data
            }
        }).toArray().then(data => {
            client.close();
            return res.json(data);
        })
    })
});

Irei me atentar apenas a parte que importa:

        blog.find({
            "createdAt": {
                [operador]: data
            }
        }).

Veja que eu seleciono o campo createdAt que defini lá no começo para ser o meu campo, e utilizo o colchetes para indicar que operador se trata de uma chave :)

Aqui vale ressaltar novamente que se você quiser trabalhar apenas com datas maiores, poderia substituir [operador] por apenas:

$gt: data

Dessa forma quando fizermos uma requisição :

http://localhost:3333/campaigns?dtEnd=>2020-05-25T05:55:23.406Z 

O retorno:

[
  {
    "_id": "5ed11506e3d7ed3b66d8f1af",
    "name": "Geovani",
    "idade": 25,
    "createdAt": "2020-05-29T13:58:30.902Z"
  },
  {
    "_id": "5ed12a06e23c884d82c1a13f",
    "name": "Marcelo",
    "idade": 28,
    "createdAt": "2020-05-29T15:28:06.096Z"
  }
]

E dentro do banco eu criei um registro com data em 2016 para ter certeza que está filtrando corretamente ( inclusive para datas anteriores), então um request com data diferente:

http://localhost:3333/campaigns?dtEnd=<2016-06-08T00:00:00.000Z

O retorno:

[
  {
    "_id": "5ed12b12051a3a4e7fa2a3e6",
    "name": "Patricia",
    "idade": 32,
    "createdAt": "2016-06-05T03:00:00.000Z"
  }
]

Dessa forma conseguímos fazer a filtragem por data, obviamente poderíamos criar um mecanismo de validação para devolver um erro caso o formato passado pela query seja invalido, e também criar uma maneira melhor de separar os dados da query, mas assumindo que está tudo correto, essa seria uma maneira simples :)

Abraços e Bons Estudos!