javascript - 将日期从毫秒转换为 ISODate 对象

标签 javascript mongodb type-conversion aggregation-framework

我正在尝试按小时聚合 MongoDB 集合中的记录,并且需要将存储为时间戳(毫秒)的日期转换为 ISODate,以便我可以使用聚合框架的内置日期运算符($hour、$month 等)

记录存储为

{ 
"data" : { "UserId" : "abc", "ProjId" : "xyz"}, 
"time" : NumberLong("1395140780706"),
"_id" : ObjectId("532828ac338ed9c33aa8eca7") 
} 

我正在尝试使用以下类型的聚合查询:

db.events.aggregate(
    { 
       $match : { 
         "time" : { $gte : 1395186209804, $lte : 1395192902825 } 
       } 
    }, 
    { 
       $project : {
         _id : "$_id", 
         dt : {$concat : (Date("$time")).toString()} // need to project as ISODate
       } 
    },
    // process records further in $project or $group clause
)

产生以下形式的结果:

{
    "result" : [
        { 
            "_id" : ObjectId("5328da21fd207d9c3567d3ec"), 
            "dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)" 
        }, 
        { 
            "_id" : ObjectId("5328da21fd207d9c3567d3ed"), 
            "dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)" 
        }, 
            ... 
} 

我想从日期中提取小时、日、月和年,但由于时间被预测为字符串,我无法使用聚合框架的内置日期运算符($hour 等)。

如何将时间从毫秒转换为 ISO 日期,以执行以下操作:

db.events.aggregate(
    {
        $match : { 
            "time" : { $gte : 1395186209804, $lte : 1395192902825 } 
        }
    },
    {
        $project : {
            _id : "$_id",
            dt : <ISO date from "$time">
        }
    },
    { 
        $project : {
            _id : "$_id",
            date : { 
                hour : {$hour : "$dt"} 
            }
        }
    }
)

最佳答案

实际上,有可能,诀窍是使用类似于以下的语法将毫秒时间添加到零毫秒 Date() 对象:

dt : {$add: [new Date(0), "$time"]}

我从上面修改了您的聚合以产生结果:

db.events.aggregate(
    {
        $project : {
            _id : "$_id",
            dt : {$add: [new Date(0), "$time"]}
        }
    },
    { 
        $project : {
            _id : "$_id",
            date : { 
                hour : {$hour : "$dt"} 
            }
        }
    }
);

结果是(带有您的样本数据的一项):

{
  "result": [
    {
      "_id": ObjectId("532828ac338ed9c33aa8eca7"),
      "date": {
        "hour": 11
      }
    }
  ],
  "ok": 1
}

关于javascript - 将日期从毫秒转换为 ISODate 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22698265/

相关文章:

java - Tomcat 与 Azure 中的 MongoDB 通信时出现超时错误

c# - 在 C# 中,如何在给定类型名称的情况下创建对象?

java - 如何在Java中将TIS-620字符串转换为UTF-8字符串?

mongodb - 选择 'Partial Document'

node.js - tunnel-ssh 连接后抛出错误

javascript - html4 中的自定义键盘 Tab 键顺序

javascript - 使用正则表达式查找模式并获得结果

c - 发生了什么类型转换?

javascript - 如何从返回的 promise 值中跳出循环?

javascript - 如何使用 JavaScript 根据条件从数组中删除项目