Javascript中日期之间的验证

时间:2015-04-30 13:01:18

标签: javascript mongodb mongodb-query

我有对象

var items = [
[{
    id: 1
    start: "2015-03-01 21:50:00",
    end: "2015-03-01 21:51:00"
}],
[{
    id: 2
    start: "2015-03-01 21:50:06",
    end: "2015-03-01 21:52:00"
}],
[{
    id: 3
    start: "2015-03-01 21:50:08",
    end: "2015-03-01 21:51:40"
}],
[{
    id: 4
    start: "2015-03-01 21:50:16",
    end: "2015-03-01 21:52:50"
}],
[{
    id: 5
    start: "2015-03-01 21:50:30",
    end: "2015-03-01 21:54:50"
}],
[{
    id: 6
    start: "2015-03-02 21:50:59",
    end: "2015-03-01 21:54:08"
  }]
];

同样我缺少行,我必须计算在1分钟内有多少记录的开始时间和end_time参数。

如何使用javascript和mongodb实现此目的。

1 个答案:

答案 0 :(得分:0)

您可能希望比较两个字段,获得开始和结束字段的分钟差异。你可以用两种方式做到这一点。

第一种方法是在$where查询中使用find()运算符。假设您的集合items由这些文档组成:

db.items.insert([
{
    _id: 1,
    start: ISODate("2015-03-01 21:50:00"),
    end: ISODate("2015-03-01 21:51:00")
},
{
    _id: 2,
    start: ISODate("2015-03-01 21:50:06"),
    end: ISODate("2015-03-01 21:52:00")
},
{
    _id: 3,
    start: ISODate("2015-03-01 21:50:08"),
    end: ISODate("2015-03-01 21:51:40")
},
{
    _id: 4,
    start: ISODate("2015-03-01 21:50:16"),
    end: ISODate("2015-03-01 21:52:50")
},
{
    _id: 5,
    start: ISODate("2015-03-01 21:50:30"),
    end: ISODate("2015-03-01 21:54:50")
},
{
    _id: 6,
    start: ISODate("2015-03-02 21:50:59"),
    end: ISODate("2015-03-01 21:54:08")
 }
])

使用$where运算符来获取开始日期和结束日期之间持续一分钟的文档(假设这些日期是在同一天),查询:

db.items.find({"$where": "this.end.getMinutes() - this.start.getMinutes() == 1"});

returns

/* 0 */
{
    "_id" : 1,
    "start" : ISODate("2015-03-01T21:50:00.000Z"),
    "end" : ISODate("2015-03-01T21:51:00.000Z")
}

/* 1 */
{
    "_id" : 3,
    "start" : ISODate("2015-03-01T21:50:08.000Z"),
    "end" : ISODate("2015-03-01T21:51:40.000Z")
}

但是,使用$where运算符时,有一些值得考虑的问题。来自文档:

  

$ where评估JavaScript并且无法利用索引。   因此,在表达查询时,查询性能会提高   使用标准的MongoDB运算符(例如,$ gt,$ in)。一般来说,你   只有当你不能用另一个表达你的查询时,才应该使用$ where   运营商。如果您必须使用$ where,请尝试至少包含一个   标准查询运算符,用于过滤结果集。单独使用$   需要进行表扫描。

第二种方法是使用MongoDB的 aggregation framework 。您的管道通常如下:

db.items.aggregate([
    {
        "$group": {
            "_id": {"_id": "$_id",
            "start_year": { "$year": "$start" },
            "start_month": { "$month": "$start" },
            "start_day": { "$dayOfMonth": "$start" },
            "start_hour": { "$hour": "$start" },
            "start_minutes": { "$minute": "$start" },
            "end_year": { "$year": "$end" },
            "end_month": { "$month": "$end" },
            "end_day": { "$dayOfMonth": "$end" },
            "end_hour": { "$hour": "$end" },
            "end_minutes": { "$minute": "$end" }},
            "data": {
                "$addToSet": "$$ROOT"
            }
        }
    },
    {
        "$project": {
            "isMinuteDuration": {
                "$eq": [
                    { "$subtract": [ "$_id.end_minutes", "$_id.start_minutes" ] },
                    1                   
                ]
            },            
            "data": 1,
            "_id": 0
        }
    },
    {
        "$match": {
            "isMinuteDuration": true
        }
    },
    {
        "$unwind": "$data"
    },
    {
        "$project": {
            "_id": "$data._id",
            "start": "$data.start",
            "end": "$data.end"
        }
    }
])

<强>输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : 3,
            "start" : ISODate("2015-03-01T21:50:08.000Z"),
            "end" : ISODate("2015-03-01T21:51:40.000Z")
        }, 
        {
            "_id" : 1,
            "start" : ISODate("2015-03-01T21:50:00.000Z"),
            "end" : ISODate("2015-03-01T21:51:00.000Z")
        }
    ],
    "ok" : 1
}