Group By MongoDb上的聚合

bil*_*ill 6 mongodb aggregation-framework

我用的是mongodb 2.6.我以这种形式存储了我的数据:

{ 
    "_id" : "my-sensor-1", 
    "points": [ 
        { "timeStamp" : NumberLong("1453468362174"), "value" : 41 }, 
        { "timeStamp" : NumberLong("1453468483297"), "value" : 66 }, 
        { "timeStamp" : NumberLong("1453468485568"), "value" : 49 },
         ...    
    ] 
}
Run Code Online (Sandbox Code Playgroud)

为了聚合文档,我做了这样的查询:

db.pointsTest.aggregate([
    { $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163}}, 
                        {"_id":"my-sensor-10"} ] } },
    {"$unwind":"$points"},
    {$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}}}
])
Run Code Online (Sandbox Code Playgroud)

{"_ id":"my-sensor-1","average":52}

结果

我已将时间戳存储为毫秒,因此每次我想要聚合特定时间间隔时,我必须更改timeStamp值的范围.

我怎样才能在一个时间段内进行聚合并按间隙间隔对结果进行分组(即将现在的平均值()-1day GROUP聚合1h)?

编辑

我想做这样的事情:

db.pointsTest.aggregate([
    { $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163, $lt : 1453555555555}}, {"_id":"my-sensor-10"} ] } }, {"$unwind":"$points"}, {$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}, ???}}
])
Run Code Online (Sandbox Code Playgroud)

结果将是这个时间间隔的平均值,按1h分组.假设我想要汇总12月31日每小时的平均值:

时间间隔31/12/2015 20:00:00,平均值:xyz

时间间隔31/12/2015 21:00:00,平均值:xyz

此时为了实现这一点,我必须在1小时间隔内分割时间间隔并向数据库发出几个请求.

IE使用InfluxDB做同样的事情我这样做:

"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"
Run Code Online (Sandbox Code Playgroud)

Vis*_*was 3

您需要在 Mongo 查询中进行一些数学计算,以根据不同的间隔对数据进行分组。

$subtract 和 $mod 的组合将帮助您按特定间隔对数据进行分组。

查询将如下所示:

db.sensor.aggregate({
    $match: {
    $and: [{
        "points.timeStamp": {
            $gt: 1453433925163,
            $lt: 1453555555555
        }
    }, {
        "_id": "my-sensor-1"
    }]
    }
}, {
    $unwind: "$points"
}, {
    "$group": {
    "_id": {
        "$subtract": ["$points.timeStamp", {
            "$mod": ["$points.timeStamp", 1000 * 60]
        }]
    },
    "average": {
        "$avg": "$points.value"
    }
    }
})
Run Code Online (Sandbox Code Playgroud)

希望这会对您有所帮助。