0

我想为我的数据库解决方案尝试 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 个结果。

提前致谢!

4

1 回答 1

1

我该怎么做才能按未预定义的采样率聚合我的数据,例如 $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" }
    } }
])
于 2015-02-20T18:59:09.907 回答