使用Node.js,Express和MongoDB查找ISODate

时间:2016-09-13 12:35:52

标签: javascript node.js mongodb express

我在网络服务器上使用Node.js和Express来查询数据库服务器上的MongoDB并遇到让日期一起工作的问题,我在这里读了很多关于这个问题的线程,最值得注意的是这一个:

Inserting and Querying Date with MongoDB and Nodejs

我很确定我明白我应该做的事情,但我尝试的任何事情似乎都无效。

在我的.js文件中,我有以下内容:

var todayStart = new Date();
todayStart.setSeconds(0);
todayStart.setHours(0);
todayStart.setMinutes(0);
todayStart.setMilliseconds(0);

var todayEnd = new Date(todayStart);
todayEnd.setHours(23);
todayEnd.setMinutes(59);
todayEnd.setSeconds(59);
todayEnd.setMilliseconds(999);

var query = {
    "date": {
        $gte: new Date(todayStart).toISOString(),
        $lte: new Date(todayEnd).toISOString()
    }
};

我的查询var以我期望的格式输出到控制台:

{ date:
   { '$gte': '2016-09-13T00:00:00.000Z',
     '$lte': '2016-09-13T23:59:59.999Z' }
}

我尝试使用我的查询变量或日期变量本身,并且都返回null结果(无错误):

db.collection('test').findOne(query, function(err, result) {
db.collection('test').findOne({"date" : {$gte: new Date(todayStart).toISOString(),$lte: new Date(todayEnd).toISOString() }}, function(err, result) {

但是,如果我只是插入我的日期,它会返回我的结果:

db.collection('test').findOne({"date" : {$gte: new Date("2016-09-13T00:00:00.000Z"),$lte: new Date("2016-09-13T23:59:59.999Z") }}, function(err, result) {

知道我在这里失踪的是什么吗?

2 个答案:

答案 0 :(得分:3)

无需将日期转换为ISO字符串格式,只需使用JS日期进行查询。有关原因的详细说明,请参阅documentation

您的开始日期对象应将当前日期时间小时保持在00:00:00.000(毫秒精度),并将今天日期的小时数设置为23:59:59.999到结束日期变量:

var todayStart = new Date();
todayStart.setHours(0,0,0,0);

var todayEnd = new Date();
todayEnd.setHours(23,59,59,999);

var query = {
    "date": {
        $gte: todayStart,
        $lte: todayEnd
    }
};

db.collection('test').findOne(query, function(err, result) {
    if (err) throw new Error();
    console.log(JSON.stringify(result));
});

如果您使用 momentjs 库,可以使用 startOf() endOf()来完成当前日期对象上的方法,将字符串'day'作为参数传递:

var todayStart = moment().startOf('day'); // set to 12:00 am today
var todayEnd = moment().endOf('day'); // set to 23:59 pm today

答案 1 :(得分:0)

您可以使用isodate

  var isodate = require('isodate');



var query = {

"date" : {
                '$gte' : isodate(todayStart ),
                '$lt' : isodate(todayEnd )
            }
};