如何编写返回日期在两个日期之间的所有文档的查询?

时间:2015-02-27 01:25:31

标签: mongodb mongoose

我有一个事件数据库,我想查找给定月份内的所有事件。我正在采取的方法是找到所有日期大于2015年2月1日且小于或等于2015年2月28日的活动。以下是我的代码:

var start = '2015-02-01T00:00:00:000Z';
var end = '2015-02-28T00:00:00:000Z';
Event
    .find({
        'start_date': {
            '$gte' : start,
            '$lte' : end
        }
    })
    .sort({start_date: 1})
    .exec(function (err, data) {
    if (err) {
        console.log('ERROR = ' + err);
    } else {
        month = data;
        console.log('month' = JSON.stringify(month));
        ... // do other stuff
    }
});

我的查询总是空回来,即使我的数据库中有记录应该返回。我做错了什么?

UPDATE ---------------------------------------------- ----------

这是我正在使用的架构:

var eventSchema = mongoose.Schema({
    title : String,
    details : String,
    start_date : Date,
    end_date : Date,
    created : {
        type: Date,
        default: Date.now
    }
});

1 个答案:

答案 0 :(得分:0)

有关如何解决此问题的一个很好的解释可以在文章Querying for a Date Range (Specific Month or Day)中找到,它基本上建议您构造表示用于执行范围查询的月份的开始和结束的Date实例(请记住在Date()构造函数中,month参数是从0开始的索引,即从0开始计数,而不是1.另一方面,日期从1开始计数:

var start = new Date(2015, 1, 1);
var end = new Date(2015, 2, 1);

Event.find({
        'start_date': {
            '$gte' : start,
            '$lt' : end
        }
    })
    .sort({start_date: 1})
    .exec(function (err, data) {
    if (err) {
        console.log('ERROR = ' + err);
    } else {
        month = data;
        console.log('month' = JSON.stringify(month));
        ... // do other stuff
    }
});

您还可以尝试使用ISODate进行查询,看看它是否有所作为:

'start_date': {
     $gte: ISODate("2015-02-01T00:00:00.000Z"),
     $lt: ISODate("2015-02-28T00:00:00.000Z")
 }