时间序列的MongoDB聚合

时间序列的MongoDB聚合,mongodb,mapreduce,aggregation-framework,Mongodb,Mapreduce,Aggregation Framework,我使用MongoDB来存储时间序列数据,其结构与此处解释的“面向文档的设计”类似:[ 数据是稀疏的,不是周期性的;示例如下所示: { "_id" : ObjectId(), "sensor_hw" : "somesensor", "day" : ISODate("2017-06-22T00:00:00Z"), "0" : { // hour "0" : { // minute

我使用MongoDB来存储时间序列数据,其结构与此处解释的“面向文档的设计”类似:[ 数据是稀疏的,不是周期性的;示例如下所示:

    {
        "_id" : ObjectId(),
        "sensor_hw" : "somesensor",
        "day" : ISODate("2017-06-22T00:00:00Z"),
        "0" : {  // hour
                 "0" : {  // minute
                          "0": [1, 2, 3],  //second: measures [x, y, z]
                          "1": [1, 2, 3],
                          "2": [1, 2, 3],
                          ...
                 },  
                 "1" : {
                          "0": [1, 2, 3],
                          "1": [1, 2, 3],
                          "2": [1, 2, 3],
                          ...
                 },  
                 ...
        },
        "1" : {  // hour
                 "2" : {  // minute
                          "3": [1, 2, 3],  //second
                          "10": [1, 2, 3],
                          "15": [1, 2, 3],
                          ...
                 },  
                 ...
        },
                .
                .
                .
   }
我想直接与mongodb合并这些时间序列,以获得最终可以限制在时间范围内的扁平结构,类似于:

{
    timestamp:  ISODate("2017-06-22T00:00:01Z"),
    x: 1,
    y: 2,
    z: 3
},
...
{
    timestamp:  ISODate("2017-06-22T01:02:03Z"),
    x: 1,
    y: 2,
    z: 3
}

获取此信息的最有效方法是什么?

这种结构的全部要点是保存“预聚合”的数据,您可以“收集”这些数据当你写的时候。如果你认为你需要对它进行进一步的聚合,那么你就错了。建议你如何绘制数据的最后30分钟?这个想法和为什么你有所有的命名键,所以当你每分钟递增时,你也会写到小时和每天,或者无论你的间隔模式是什么。最ent MongoDB拥有处理聚合框架中命名键的工具,所有版本都可以通过map reduce聚合。但是如果您首先阅读某个地方来存储这样的数据,那么您确实需要理解为什么要这样做。如果您实际上不理解,那么它的格式对您来说是错误的。存储在普通文档和/或数组。