我在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"),
}
答案 0 :(得分:1)
实际上你的每两小时一次"一天中的数据将涵盖来自样本的三个时间段。所以文件1是两个小时的第一个,2& 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 } }
])