每天获取最后插入的项目

时间:2017-06-06 09:59:23

标签: mongodb aggregation-framework

mongodb中是否有一项功能可以用来获取每天最后插入的项目?我有一个集合,我需要每天获取最后一个插入的项目,数据按小时分组,如下面的结构。

{
   timestamp: 2017-05-04T09:00:00.000+0000,
   data: {}
},
{
   timestamp: 2017-05-04T10:00:00.000+0000,
   data: {}
}

我想过使用投影,但我不太确定如何做到这一点。

编辑:另外,由于mongodb以UTC格式存储数据,我也想考虑偏移量。

1 个答案:

答案 0 :(得分:1)

您可以$sort并使用$last作为该项目,并将分组键四舍五入到每一天:

db.collection.aggregate([
  { "$sort": { "timestamp": 1 } },
  { "$group": {
     "_id": {
       "$add": [
         { "$subtract": [
           { "$subtract": [ "$timestamp", new Date(0) ] },
           { "$mod": [
             { "$subtract": [ "$timestamp", new Date(0) ] },
             1000 * 60 * 60 * 24
           ]}
         ]},
         new Date(0)
       ]
     },
     "lastDoc": { "$last": "$$ROOT" }
  }}
])

因此排序会使事情按顺序显示,然后通过某个日期数学对每天的分组_id进行舍入。您从当前日期中减去纪元日期,使其成为一个数字。使用模数舍入到一天,然后将纪元日期添加到数字以返回Date

因此,我们通过数学计算获得了$subract行日期的时间戳值。我们这样做了几次:

{ "$subtract": [ "$timestamp", new Date(0) ] }

// Is roughly internally like
ISODate("2017-06-06T10:44:37.627Z") - ISODate("1970-01-01T00:00:00Z")
1496745877627

然后有$mod的模数,当应用于数值时返回差值。 1000毫秒* 60秒* 60 *分钟* 24小时给出了另一个论点:

 { "$mod": [
   { "$subtract": [ "$timestamp", new Date(0) ] },
   1000 * 60 * 60 * 24
 ]}

 // Equivalent to 
 1496745877627 % (1000 * 60 * 60 * 24)
 38677627

然后是两个数字的包裹$subtract

 { "$subtract": [
   { "$subtract": [ "$timestamp", new Date(0) ] },
   { "$mod": [
     { "$subtract": [ "$timestamp", new Date(0) ] },
     1000 * 60 * 60 * 24
   ]}
 ]}

 // Subtract "difference" of the modulo to a day
 // from the milliseconds value of the current date
 1496745877627 - 38677627

 1496707200000

然后添加回epoch日期值以创建舍入到当前日期的日期,这对聚合管道基本上看起来像为构造函数提供毫秒值:

new Date(1496707200000)
ISODate("2017-06-06T00:00:00Z")

其中取时间戳值并从“一天”中除去除数的差值,并在“一天开始”时结束。

在这里使用$$ROOT代表整个文档。但是,此处提供给$last的任何文档路径都会提供结果。

相关问题