对于我的一个集合,它必须保持unix时间戳而不是isodate,我通常会将时间戳转换为新的日期(unix_timestamp)。
现在我需要聚合中的new Date(ts)
。 (示例在PHP中)
'$ project'=> array('day'=>'$ new Date(ts)',...
'$ group'=> array(“_ id”=> array('day'=>'$ day)',...),...
未到达结果。结果中的字段“天”完全丢失。
如何在聚合中转换?
答案 0 :(得分:26)
为了能够从文档中添加时间戳字段,您可以这样做,给定:
{"ts": 1400512120100}
汇总为日期:
db.foo.aggregate({
$project: {
date: { $add: [new Date(0), "$ts"] }
}
})
答案 1 :(得分:3)
对于投影中的其他计算字段,您需要使用$ add运算符,如下所示: (控制台示例)
db.so.aggregate([{$project: {date: {$add: Date() }}}])
但这是错误的,我们收到错误消息:
exception: $add does not support strings (or dates)
但我发现了一个简单的黑客=)
db.so.aggregate([{$project: {date: {$substr: [Date(), 0, -1] }}}])
在这种情况下,我们会预期带有日期的结果 此外,在PHP输出中,您可以看到如下错误:
exception: disallowed field type Date in object expression (at 'date')
现在,解决方案(php 5.4语法):
$so->aggregate([
['$project' => ["date" => ['$substr' => [new MongoDate(), 0, -1]] ] ]
]);
答案 2 :(得分:0)
从Mongo 4.0
开始,可以使用$toDate
聚合运算符来实现:
// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }