我想尝试MongoDB作为我的数据库解决方案,所以我正在尝试它。聚合框架非常完美,大多数文档都很好地解释了我必须做什么。
我的数据如下:
{ "_id" : ObjectId("54e5e79032d4796d1dec195e"),
"timestamp" : ISODate("2015-01-20T10:31:02.082Z"),
"value" : 4089 }
例如,如果我想每秒聚合我的数据,我会这样做:
db.mycollection.aggregate(
{
$match : {
timestamp: {$gte: ISODate("2015-01-21T12:00:00Z"),
$lte: ISODate("2015-01-21T12:01:00Z")}
}
},
{
$group : {
_id : { $second: "$timestamp" },
averageQuantity: { $avg: "$value" },
count: { $sum: 1 }
}
}
);
我的问题是,我必须做什么才能通过而不是预定义的采样率来聚合我的数据,比如$second或$minute,但假设是30秒?
使用示例中的代码,我希望返回2个结果。
提前感谢!
我必须做些什么才能通过一个未预定义的采样率来聚合我的数据,比如$second或$minute,但假设是30秒?
聚合管道中有很多数学运算。例如,如果你想花一天的时间,以30秒的间隔进行分组,你需要用timestamp
计算它代表一天中的秒数,然后将其转换为一天中30秒间隔的四舍五入数,并以此为基础进行分组。
db.mycollection.aggregate([
{ "$project" : {
"secs" : {
"$add" : [
{ "$multiply" : [{ "$hour" : "$timestamp"}, 60, 60] },
{ "$multiply" : [{ "$minute" : "$timestamp"}, 60] }
{ "$second" : "$timestamp"}
]
}
"value" : 1
} },
{ "$group" : {
"_id" : {
"$divide" : [
{ "$subtract" : [
"$secs",
{ "$mod" : ["$secs", 30] }
] },
30
]
},
"value" : { "$sum" : "$value" }
} }
])