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 :)
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!