时间序列数据的MongoDB聚合

时间序列数据的MongoDB聚合,mongodb,mapreduce,time-series,aggregation-framework,Mongodb,Mapreduce,Time Series,Aggregation Framework,对于时间序列数据,我有以下文档结构(事件集合)。我根据上一篇文章决定了这种结构 } 现在,我试图从分钟数中获取平均cpu使用量,并将其存储为每小时一次。聚合和映射函数在列表和数组上运行良好,我无法从分钟中获得平均每小时数,我也希望获得平均每天数 我使用java作为编程语言。在应用程序中还是使用聚合框架进行计算更好 非常感谢您的帮助。一个“预聚合”结构的要点是,您要向它写入内容,并且在执行过程中,$inc值。这就是为什么有所有的钥匙。以后再做聚合也是非常可怕的。所以,如果你所有的数据只进入“分钟”

对于时间序列数据,我有以下文档结构(事件集合)。我根据上一篇文章决定了这种结构

}

现在,我试图从分钟数中获取平均cpu使用量,并将其存储为每小时一次。聚合和映射函数在列表和数组上运行良好,我无法从分钟中获得平均每小时数,我也希望获得平均每天数

我使用java作为编程语言。在应用程序中还是使用聚合框架进行计算更好


非常感谢您的帮助。

一个“预聚合”结构的要点是,您要向它写入内容,并且在执行过程中,
$inc
值。这就是为什么有所有的钥匙。以后再做聚合也是非常可怕的。所以,如果你所有的数据只进入“分钟”,那么你就做错了。要使用聚合框架并遍历命名键,您至少需要MongoDB 3.4。否则您将需要mapReduce来遍历关键点和聚合。谢谢您,尼尔。我们仍处于初始阶段,可以灵活地进行任何结构调整。这个想法是存储每分钟的cpu/内存统计数据。我们有一个仪表板来显示每月/每小时/分钟的统计数据。有什么更好的结构可以做到这一点。最好的方法是至少在写分钟的同时写“每小时”。根据需要,文档可能每天甚至每小时更新一次。出于同样的原因,您甚至可以每天和每月对文档和集合进行分离,还可以意识到您不需要实时完成所有操作,您可以“消息队列”操作并编写后续操作。这是一个非常广泛的课题,你应该进一步研究。所有这些问题都会吸引一些愚蠢的尝试,试图为您编写一个total查询。随着你的规模,这将是无用的。
{
    "_id" : "06062017/cpu",
    "metadata" : {
            "host" : "localhost",
            "createdDate" : ISODate("2017-06-09T11:18:56.120Z"),
            "metric" : "cpu"
    },
    "hourly" : {
            "0" : {
                    "total" : 2,
                    "used" : 1
            },
            "1" : {
                    "total" : 3,
                    "used" : 2
            }
    },
    "minute" : {
            "0" : {
                    "0" : {
                            "total" : 9789789,
                            "used" : 353
                    },
                    "1" : {
                            "total" : 0,
                            "used" : 0
                    }
            },
            "1" : {
                    "0" : {
                            "total" : 0,
                            "used" : 0
                    },
                    "1" : {
                            "total" : 234234,
                            "used" : 123
                    }
            }
    }