Javascript MongDB with Mongoose-选择指定的日期范围丢弃时间
我有一个mongoose模式,由一个带有日期字段的元素数组组成Javascript MongDB with Mongoose-选择指定的日期范围丢弃时间,javascript,node.js,mongodb,date,mongoose,Javascript,Node.js,Mongodb,Date,Mongoose,我有一个mongoose模式,由一个带有日期字段的元素数组组成 var querySchema = new Schema({ id : String, description: String, results : [{ date : { type: Date, default: new Date }, result: Object }] }); 当我添加新元
var querySchema = new Schema({
id : String,
description: String,
results : [{
date : { type: Date, default: new Date },
result: Object
}]
});
当我添加新元素时,我使用新日期
。产生如下元素:
{
"_id" : ObjectId("55b96289c9dcbe79207c4b08"),
"id" : "11",
"description" : "List of graphs loaded in the KB (24 graphs as of 09/05/2015 + 5 default Virtuoso graphs)",
"results" : [
{
"result" : "",
"_id" : ObjectId("55b96289c9dcbe79207c4b09"),
"date" : ISODate("2015-07-29T22:00:00.000Z")
},
{
"result" : "",
"_id" : ObjectId("55b962e05489d4de20a99f87"),
"date" : ISODate("2015-07-31T22:00:00.000Z")
},
{
"result" : "",
"_id" : ObjectId("55b963284f5083492119ef5b"),
"date" : ISODate("2015-08-29T22:00:00.000Z")
}
],
"__v" : 0
}
我想找到的结果,属于一个特定的日期范围内,无论时间。我想做的是通过查询参数接受用户输入的范围,如果不是,那么范围将是todays元素
router.route('/aggregate')
.get(function(req, res) {
if (req.param('id')) {
// Extract the date range filterin query paramteres if they were passed
var start = new Date(req.param('start')) || new Date;
var end = req.param('end') ? new Date(req.param('end')) : new Date;
Query.aggregate([
{
"$match":
{
id : req.param('id'),
"results.date": { "$lt": end, "$gt": start }
},
}],function(err,result) {
res.json(result);
});
} else res.json({message: 'Invalid request. Please specify a query ID'});
});
例如,我试着用参数?id=11&start=“2014,7,31”
打电话,它显示了7月29日的结果。各种查询都不起作用,所以我知道有问题
我尝试过各种日期格式,删除时间或重置时间,但到目前为止没有任何效果
非常感谢您的帮助。UTC时间的JavaScript
Date
对象构造函数可以将输入作为“字符串”:
但这是不正确的:
> new Date(2015,7,31)
ISODate("2015-08-30T14:00:00Z")
要么是:
> new Date("2015/7/31")
ISODate("2015-07-30T14:00:00Z")
UTC还有其他有效的构造函数值,如数值(如果适用):
> new Date(1406764800000)
ISODate("2014-07-31T00:00:00Z")
或者简单地将日期四舍五入,如下所示:
> var date = new Date()
> date
ISODate("2015-07-30T01:42:23.631Z")
> new Date( date.valueOf() - ( date.valueOf() % ( 1000 * 60 * 60 * 24 ) ) )
ISODate("2015-07-30T00:00:00Z")
这些是使用基本对象构造函数和值处理整个日期的方法,没有任何时分或秒
将UTC日期设为一整天,这应该适合您的选择。感谢@Blakes的注释。然而,这仍然没有解决我的问题。由于某些原因,MongoDB仍然无法进行日期比较。我已经传递了日期字符串a
2015/7/31
,我得到了2015年8月31日周一00:00:00 GMT+0200(CEST)
@Ahmadassas如果它们不是注释,它们是从“字符串”或数值设置日期的“正确”方法。您正在发送的当前字符串将不会形成正确的值。使用上面的例子。即“2015/7/31”错误!“2015-07-31”正确!抱歉,如果术语“注释”不合适。然而,我确实做到了这一点,我用您指定的方法对日期进行了硬编码新日期(“2015/7/31”)
和新日期(1406764800000)
。我想知道MongoDB中的日期类型是否需要特定的内容,因为没有进行比较。好的。。对不起,我知道新日期(2015年7月31日)
是正确的方式。这个词要么让我困惑,要么我猜你的意思都不是。我认为现在很好:)使用硬编码值“$lte”:新日期(“2015-08-31”),“$gte”:新日期(“2015-07-31”)
应该返回大于31-7但小于31-8的日期(结果集中的两个值)。然而这不起作用,我仍然猜测它与MongoDB有关
> var date = new Date()
> date
ISODate("2015-07-30T01:42:23.631Z")
> new Date( date.valueOf() - ( date.valueOf() % ( 1000 * 60 * 60 * 24 ) ) )
ISODate("2015-07-30T00:00:00Z")