javascript - MongoDB with 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
        }]
});

当我添加新元素时,我使用 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 日的结果。各种查询都不起作用,所以我知道出了点问题。

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

非常感谢任何帮助。

最佳答案

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

关于javascript - MongoDB with Mongoose - 选择指定日期范围丢弃时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713342/

相关文章:

javascript - 在由 componentDidMount 创建的 React 中切换折叠

javascript - 如何在响应式 UI 中固定 div 的位置

javascript - 检测客户端的 socket.io 断开连接和销毁事件

node.js - 无法通过提供 req.body 创建模型

javascript - 如何通过纯 NodeJS 从 MongoDB 读取数据?

javascript - react : How can i run a function from another Component with state Variables

javascript - Highcharts 中的最小值和最大值不正确

sql - Sequelize.js - 在 'findAll' 之后删除实例数组

mysql - 如何链接mySQl和mongoDB

php - 在 MongoDB 和 PHP 中根据引用 ID 查找文档