我正在使用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));
});
答案 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)
我解决它的方法是使用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
})