Query com Data no mongodb

3,726 views
Skip to first unread message

Welington Monteiro

unread,
Jan 23, 2014, 11:05:22 AM1/23/14
to nod...@googlegroups.com
Ola Pessoal, 
Gostaria de saber se alguem faz alguma ideia de como  fazer uma consulta no mongoDB, por uma data.
tenho um campo em formato de datetime, mas quando tento fazer uma busca por este campo não me retorna nada, percebi que isso ocorre devido as horas gravadas juntamente com a data,
existe alguma forma de se fazer uma busca por data, desprezando  a hora?
no Exemplo abaixo quando  quero buscar por uma data especifica nao funciona:

Supondo que tenho um tenho um arquivo com data : '2012-05-16T20:54:35.630Z', e quero buscar por ele despresando as horas, o exemplo abaixo tento buscar por uma data maior ou igua a, e menor e igual a.



var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect('localhost', 'testing_querybydate');
 
var schema = new Schema({
created: Date
, data: {}
});
 
var A = mongoose.model('A', schema);
 
mongoose.connection.on('open', function () {
var a = new A({ created: new Date });
a.save(function (err, a) {
if (err) return console.error(err.stack||err);
 
A.find({ created: { $gte: new Date(2012,05,16),$lte: new Date(2012,05,16) }}, function (err, docs) {
if (err) console.error(err.stack||err);
console.error('found', docs);
 
mongoose.connection.db.dropDatabase(function () {
mongoose.connection.close();
});
});
})
});

O timezone tambem interfere na data correta?

Abs.

Ricardo Tomasi

unread,
Jan 23, 2014, 11:26:48 AM1/23/14
to nod...@googlegroups.com
Tu está buscando entre 05/16/2012 00:00 e 05/16/2012 00:00, o que obviamente não vai retornar nenhum resultado. A busca correta seria até o início do dia seguinte:

{ $gte: new Date(2012, 5, 16), $lt: new Date(2012, 5, 17)
ou
{ $gte: new Date(2012, 5, 16), $lte: new Date(2012, 5, 16) + (1000 * 60 * 60 * 24) }

É interessante usar o moment.js pra esse tipo de coisa, fica mais fácil entender:
var mongoose = require('mongoose'),
    moment = require('moment');
// ...

var start = moment('06-16-2012'),
    end   = moment(start).endOf('day');

A.find({ created: { $gte: start, $lte: end }}, function (err, docs) {
    if (err) console.error(err.stack || err);
    console.error('found', docs);
});
Todas as datas, tanto em javascript como no mongo, são tratadas como unix epoch (UTC), tem que levar o timezone da máquina em conta.

-- 
Ricardo Tomasi
Sent with Airmail
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Node.js Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para nodebr+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Welington Monteiro

unread,
Jan 23, 2014, 12:09:25 PM1/23/14
to nod...@googlegroups.com
Muito Obrigado Ricardo Tomasi,
Já estava de cabelo em pé com isso, funcionou perfeitamente aqui.
A partir de agora irei utilizar este modulo para todas as datas minha..
Valew...Abraços
Reply all
Reply to author
Forward
0 new messages