使用Mongoose的MongDB - 选择指定的日期范围丢弃时间

时间:2015-07-30 00:24:45

标签: javascript node.js mongodb date mongoose

我有一个mongoose架构,由一组带有日期字段

的元素组成
var querySchema  = new Schema({
        id         : String,
        description: String,
        results    : [{
            date  : { type: Date, default: new Date },
            result: Object
        }]
});

当我添加新元素时,我使用New Date。导致像:

这样的元素
{
    "_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
}

我希望无论何时何时都能找到属于特定日期范围的结果。我想做的是通过查询参数接受他想要的范围内的用户输入,如果不是,那么范围将是今天的元素。

    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日的结果。各种查询都不起作用,所以我知道有问题。

我尝试了各种日期格式,删除时间重置它但到目前为止没有任何工作。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

UTC时代的JavaScript Date对象构造函数可以将输入作为" String":

>  new Date("2014-07-31")
ISODate("2014-07-31T00:00:00Z")

但这正确:

> 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日期,这应该适合您的选择。