2014-09-22 148 views
0

我有一个每小时有一些数据的mongodb小时报表。现在我想从它得到双小时报告,这意味着它将有来自每两小时的字段“计数”和“值”的总和。如何做聚合?非常感谢!mongodb:按小时汇总汇总小时数据

之前,每小时的数据:

/* 1 */ 
{ 
    "count" : 63713, 
    "value" : 46151, 
    "timestamp" : ISODate("2014-09-17T18:59:04.247+03:00"), 
} 

/* 2 */ 
{ 
    "count" : 63743, 
    "value" : 48327, 
    "timestamp" : ISODate("2014-09-17T19:59:04.281+03:00"), 
} 

/* 3 */ 
{ 
    "count" : 63761, 
    "value" : 51650, 
    "timestamp" : ISODate("2014-09-17T20:59:04.295+03:00"), 
} 

/* 4 */ 
{ 
    "count" : 63756, 
    "value" : 52865, 
    "timestamp" : ISODate("2014-09-17T21:59:04.298+03:00"), 
} 

后,双向每小时的数据:

/* sum of documents 1&2 */ 

{ 
    "count" : 117456, 
    "value" : 94478, 
    "timestamp" : ISODate("2014-09-17T18:59:04.247+03:00"), 
} 

/* sum of documents 3&4 */ 

{ 
    "count" : 127517, 
    "value" : 104515, 
    "timestamp" : ISODate("2014-09-17T20:59:04.295+03:00"), 
} 

回答

1

其实你的“双计时”的数据在一天内将覆盖从三个时间段样品如给定。因此,文档1是在两个小时的第一块,第二个是& 3,第二个是4,第三个是第三个。

所以,你真的可以只适用于一些需要数学这里在一天之内获得两名12周小时的时间间隔:

db.times.aggregate([ 
    { "$group": { 
     "_id": { 
      "$subtract": [ 
       { "$subtract": [ "$timestamp", new Date("1970-01-01") ] }, 
       { "$mod": [ 
        { "$subtract": [ "$timestamp", new Date("1970-01-01") ] }, 
        1000 * 60 * 60 * 2 
       ]} 
      ], 
     }, 
     "count": { "$sum": "$count" }, 
     "value": { "$sum": "$value" } 
    }}, 
    { "$sort": { "_id": 1 } } 
]) 

这将产生一个代表在两个小时的间隔日期时间戳值。或者您可以使用日期汇总运算符来代替:

db.times.aggregate([ 
    { "$group": { 
     "_id": { 
      "day": { "$dayOfYear": "$timestamp" }, 
      "hour": { 
       "$subtract": [ 
        { "$hour": "$timestamp" }, 
        { "$mod": [ { "$hour": "$timestamp" }, 2 ] } 
       ] 
      } 
     }, 
     "count": { "$sum": "$count" }, 
     "value": { "$sum": "$value" } 
    }}, 
    { "$sort": { "_id": 1 } } 
]) 
+0

感谢您的快速响应。其实我的小时数据来自最近的24小时,而不是一整天。我想得到12个两小时的间隔数据。在这种情况下,我不需要关心一天的时间段。但这是一个很好的考虑因素,因为我可能还需要稍后汇总到日常数据。 – whitecat999 2014-09-22 10:03:24

+0

@ whitecat999聚合框架没有两个文档之间“承载数据”的概念,或者确实存在任何“全局”变量的概念。所以,如果你正在寻找一个“开始时间”,那么我会主要建议你以错误的方式接近问题。你可能可以通过mapReduce来设计一些东西,但是它会非常混乱,而且会变慢很多。简化您的要求。 – 2014-09-22 10:56:40