分组前的偏移值

时间:2017-01-31 05:14:38

标签: mongodb mongodb-query aggregation-framework unix-timestamp timezone-offset

我有几个项目,其中一个字段是基于UTC的unix时间戳乘以1000,以便包括毫秒,同时保持long(整数)值。

{ 
    "title" : "Merkel 'explains' refugee convention to Trump in phone call", 
    "iso" : "2017-01-31T04:03:53.807+0000", 
    "id" : NumberLong(1485835433807)
}
{ 
    "title" : "NASA to Explore an Asteroid Containing Enough Mineral Wealth to Collapse the World Economy", 
    "iso" : "2017-01-30T23:20:27.327+0000", 
    "id" : NumberLong(1485818427327)
}
{ 
    "title" : "IMGKit: Python library of HTML to IMG wrapper", 
    "iso" : "2017-01-30T23:15:39.488+0000", 
    "id" : NumberLong(1485818139488)
}

iso字段只是一个文本字符串,以方便调试,它没有其他用途。

我打算使用https://stackoverflow.com/a/26550803/277267中描述的方法重新取样项目,每天创建项目摘要,最初只计算每天的项目数。

问题在于,由于UTC偏移,时间戳("id"字段)无法真正用于实现此目的。根据用户的位置(或本地插入时间,即星期一当地时间00:30对比星期日UTC时间23:30,如果时区为+ 1h),项目将属于一天或另一天,因此field缺乏此信息。

假设我只想在"id"字段中添加一个偏移量,即3600000,即以毫秒为单位表示的一小时,然后开始根据"id"字段重新采样数据,怎么能我在聚合管道中实现了这个目标吗?

有没有办法让第一个阶段获取"id"字段值,将3600000添加到该值并将其存储到"id_offsetted"字段中,然后我可以在其中执行下一个阶段?

1 个答案:

答案 0 :(得分:1)

3.4之前的版本

   {$project: { 
        "title" :  1, 
        "iso" : 1
        "id" : 1,
        "id_offsetted" : {$add: ["$id", 3600000]}   
    } }

3.4版以后

 {$addFields: {
        "id_offsetted" : {$add: ["$id", 3600000]}   
    } }