20

对于我的一个集合,它必须保留 unix 时间戳而不是 isodate,我通常将时间戳转换为 new Date(unix_timestamp)。

现在我需要new Date(ts)聚合。(示例在 PHP 中)

'$project' => 数组('day' => '$new Date(ts)', ...

'$group' => array ("_id" => array('day' => '$day)', ...),...

没有到达结果。结果中的“天”字段完全丢失。

如何在聚合中进行转换?

4

3 回答 3

26

为了能够从文档中添加时间戳字段,您可以这样做,给定:

{"ts": 1400512120100}

聚合为日期:

db.foo.aggregate({
   $project: {
       date: { $add: [new Date(0), "$ts"] }
   }
})
于 2014-05-28T11:21:07.147 回答
3

对于投影中的其他计算字段,您需要使用 $add 运算符,如下所示:(控制台示例)

db.so.aggregate([{$project: {date: {$add: Date() }}}])

但这是错误的,我们收到一条错误消息:

exception: $add does not support strings (or dates)

但我发现了一个简单的 hack =)

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]] ] ]
]);
于 2013-02-20T21:09:05.107 回答
1

开始Mongo 4.0,这可以通过$toDate聚合运算符来实现:

// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }
于 2019-06-19T20:01:00.613 回答