如何在mongodb聚合中将时间戳转换为ISO日期

时间:2015-01-27 06:38:52

标签: mongodb mongodb-query aggregation-framework

我正在使用node.js mongodb客户端。 我在集合中有一个时间戳值,现在我想使用聚合将时间戳转换为IOSDate,所以我可以轻松地比较它。但我不知道该怎么做。

   var db = game.getDB();
    var coll = db.collection("LoginRecord");
    coll.aggregate([
        {
            $project: {
                "PT" : 1,
                "PID" : 1,
                "regDate" : new Date("$createTime"), //#####createTime is a timestamp, I want to convert it to IOSDate
                "loginDay" : { $dayOfYear : "$_serverDate"}
            }
        },
        {
            $group : {
                "_id" : "$loginDay",
                "logUsers" : { $addToSet: "$PID"}
            }
        },
        {
            $unwind : "$logUsers"
        },
        {
            "$group" : {
                "_id" : "$_id",
                "logCount" : { $sum: 1}
            }
        }
    ], function(err, res) {
        logger.info("aggregate res " + JSON.stringify(res));
    });

4 个答案:

答案 0 :(得分:2)

如提及convert milliseconds to date in mongodb aggregation pipeline for group by?

您可以按照以下步骤将毫秒(时间戳)转换为日期对象:

"regDate": {
   $add: [ new Date(0), "$createTime" ]
}

答案 1 :(得分:1)

在使用聚合框架之前,只需查询集合并将文档更新为ISODate日期格式。 Mongodb时间戳对象仅供内部使用。因此,您应该将此类型永久切换为ISODate。 链接到warning.

答案 2 :(得分:1)

Mongodb 4.0引入了$toDate聚合,该聚合仅将时间戳转换为ISO日期

db.collection.aggregate([
  { "$project": {
    "regDate": { "$toDate": "$createTime" }
  }}
])

您可以尝试here

答案 3 :(得分:-1)

不幸的是,MongoDB没有提供这么简单的方法。

我解决它的方法是使用map函数在结果中注入 date 字段。

首先,设置日期转换功能,如下所示:

function toDateStr(ts) {
    let dataF = new Date();   dataF.setTime(ts);
    let strDataF = dataF.toLocaleString();
    return strDataF;
}

然后,在您的聚合中,只需在每个文档上调用此函数并插入新的日期字段。像这样:

db.Collection.aggregate([
     {
       $project: {
            timestamp: 1
          }
      },
      {
          $match: { /* something */
          }
      }
   ]
).map(function(doc) {
    doc['date'] = toDateStr(doc.timestamp);
    return doc
})