Mongodb 合计$project中的新日期()

Mongodb 合计$project中的新日期(),mongodb,aggregation-framework,Mongodb,Aggregation Framework,对于我的一个集合(必须保留unix时间戳而不是isodate),我通常使用新日期(unix\U时间戳)转换时间戳 现在,我需要聚合中的新日期(ts)。(示例使用PHP) “$project”=>数组('day'=>“$new Date(ts) “$group”=>array(“\u id”=>array('day'=>“$day”) 未到达结果中。结果中的字段“day”完全丢失 如何在聚合中转换此值?对于投影中的其他计算字段,您需要使用$add运算符,如下所示: (控制台示例) 但这是错误的,我

对于我的一个集合(必须保留unix时间戳而不是isodate),我通常使用新日期(unix\U时间戳)转换时间戳

现在,我需要聚合中的
新日期(ts)
。(示例使用PHP)

“$project”=>数组('day'=>“$new Date(ts)

“$group”=>array(“\u id”=>array('day'=>“$day”)

未到达结果中。结果中的字段“day”完全丢失


如何在聚合中转换此值?

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

但这是错误的,我们得到一个错误信息:

exception: $add does not support strings (or dates)
但我发现了一个简单的hack=)

在这种情况下,我们将得到预期的结果和日期 此外,在PHP输出中,您可以看到如下错误:

exception: disallowed field type Date in object expression (at 'date')
现在,解决方案(PHP5.4语法):


为了能够从文档中添加时间戳字段,您可以执行以下操作:

{"ts": 1400512120100}
按日期合计:

db.foo.aggregate({
   $project: {
       date: { $add: [new Date(0), "$ts"] }
   }
})

启动
Mongo 4.0
,这可以通过聚合操作符实现:

// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }

这不会将字段ts的值转换为mongo日期。它只接受php字符串或数字作为输入,而不是集合本身的值:/Ops,对不起)在这种情况下,应该使用map reduce而不是聚合吗?@KirillZorin,这太棒了!substr非常适合只投影日期,而不投影时间部分。这是非常有用的!!这对我帮助很大!我的时间戳都是UTC,我想转换成本地时间。我能用这种方法做到这一点。{$project:{$dd:{$add:[新日期(0),{$subtract:[{$multiply:[“$items.ordered”,1000]},tzoffset]}},{$project:{$dd:{$add:[新日期(1400512120100)结果,正确,在
ISODate(“2014-05-19T15:08:40.100Z”)
。但是如果您尝试使用
新日期()
$project
中,如果不使用
$add
,您将在对象表达式中获得
不允许的字段类型Date
。但是,根据本例,可以清楚地返回日期。如果在
$project
中尝试
$add:[new Date($ts”)]
,您将得到一个大的负年份(
ISODate(
ISODate(“-292275055-05-16T16:47:03.192Z”)
)。如何正确处理数据类型并返回
ISODate
而不出错?@duozmo:我认为
新日期()
不起作用的原因是
新日期()
在管道启动之前只执行一次。只有特殊的MongoDB“聚合操作符”(如
$add
$trunc
等)将为每个值运行。因此,如果要在聚合期间创建日期,必须使用其中一个运算符。由于MongoDB中没有运算符
毫秒至日期
,因此必须(ab)使用
$add
$add:[新日期(0),“$ts”]
之所以有效,是因为
$add
特别支持为日期添加毫秒。@Alexandre Russel,请查看
{"ts": 1400512120100}
db.foo.aggregate({
   $project: {
       date: { $add: [new Date(0), "$ts"] }
   }
})
// { "ts": 1400512120100 }
db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
// { "date": ISODate("2014-05-19T15:08:40.100Z") }