MongoDB聚合框架采样率



我想尝试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" }
    } }
])

相关内容

  • 没有找到相关文章

最新更新