【问题标题】:MongDB with Mongoose -Select a specified date range discarding timeMongoDB with Mongoose - 选择特定日期范围丢弃时间
【发布时间】:2015-07-30 00:24:45
【问题描述】:

我有一个由带有日期字段的元素数组组成的猫鼬模式

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

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

不胜感激。

【问题讨论】:

    标签: javascript node.js mongodb date mongoose


    【解决方案1】:

    用于 UTC 时间的 JavaScript Date 对象构造函数可以将输入作为“字符串”:

    >  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 日期设置为一整天,这应该适合您的选择。

    【讨论】:

    • 感谢@Blakes 的注释。但是,这仍然没有解决我的问题。由于某种原因,MongoDB 仍然无法进行日期比较。我已将日期字符串传递给 2015/7/31 并得到 Mon Aug 31 2015 00:00:00 GMT+0200 (CEST)
    • @AhmadAssaf 它们不是注释,它们是从“字符串”或数值设置 Date 构造函数的“正确”方式。您发送的当前字符串不会形成正确的值。使用我上面的例子。 IE。 “2015/7/31”错了! “2015-07-31”正确!
    • 对不起,如果“note”这个词不合适。但是,我正是这样做的,我在您指定的方法中对日期进行了硬编码new Date("2015/7/31")new Date(1406764800000)。我想知道 MongoDB 中的 Date 类型是否需要特定的东西,因为比较没有完成。
    • ok .. 抱歉,我知道new Date(2015,7,31) 是正确的方法。要么这个词让我很困惑,我猜你的意思都不是。我觉得现在很好:)
    • 使用硬编码值 "$lte": new Date("2015-08-31"), "$gte": new Date("2015-07-31") 应返回大于 31-7 但小于 31-8 的日期(结果集中的两个值)。但是这不起作用,我仍然猜测它与 MongoDB 相关
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多