我在网络服务器上使用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) {
知道我在这里失踪的是什么吗?
答案 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 )
}
};