MongoDB - 从日期范围计算平均值

时间:2016-01-30 22:08:17

标签: arrays mongodb

在我的应用程序中,我将响应时间存储为以5分钟为间隔的数组,如下所示:

{
    "_id" : ObjectId("56ad2e080fa76101bdd17573"),
    "date" : ISODate("2016-01-30T21:40:00Z"),
    "response_times" : [
        10,
        22,
        21,
        37
    ]
}
{
    "_id" : ObjectId("56ad2c9d0fa76101bdd17572"),
    "date" : ISODate("2016-01-30T21:35:00Z"),
    "response_times" : [
        27,
        32
    ]
}
{
    "_id" : ObjectId("56ad29c30fa76101bdd17571"),
    "date" : ISODate("2016-01-30T21:20:00Z"),
    "response_times" : [
        7
    ]
}

没有人在给定的时间间隔内打击我的应用程序(显然),如上例所示,“窗口”丢失了 - 我们有21:20:00,21:35:00和21:40:00。 / p>

这里的问题是如何查询这些结果并获得上个月所有响应时间的平均值(每个查询返回31个结果,每天一个结果)和最后一天(每个查询返回24个结果,每小时一个结果)?

为了形象化,例如“月度”聚合,我希望得到类似的东西:

{
    "date": ISODate("2016-01-01T00:00:00Z"),
    "response_time": 21
},
{
    "date": ISODate("2016-01-02T00:00:00Z"),
    "response_time": 32
},
{
    "date": ISODate("2016-01-03T00:00:00Z"),
    "response_time": 43
}

另外,也许我存储响应时间的表单存在缺陷,我是否应该更改它以便更轻松地查询数据?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架:

db.so.aggregate( 
    [ { $unwind : "$response_times" }, 
      { $group: 
          { _id:"$date", 
            average: { $avg : "$response_times" } } } 
    ] )

它提供以下输出

{

"result" : [
    {
        "_id" : ISODate("2016-01-30T21:35:00Z"),
        "average" : 29.5
    },
    {
        "_id" : ISODate("2016-01-30T21:40:00Z"),
        "average" : 22.5
    }
],

"ok" : 1
}