使用聚合框架从预聚合数据集中获取峰值

时间:2013-01-29 19:50:28

标签: mongodb mongodb-query

我有几个指标集合预先汇总到小时和分钟集合中,如下所示:

"_id" : "12345CHA-2RU020130104",
"metadata" : {
                "adaptor_id" : "CHA-2RU",
                "processor_id" : NumberLong(0),
                "date" : ISODate("2013-01-04T00:00:00Z"),
                "processor_type" : "CHP",
                "array_serial" : NumberLong(12345)
        },
"hour" : {
            "11" : 4.6665907,
            "21" : 5.9431519999999995,
            "7" : 0.6405864,
            "17" : 4.712744,
        ---etc---
    },  
"minute" : {
            "11" : {
                "33" : 4.689972,
                "32" : 4.7190895,
            ---etc---                        
                },
            "3" : {
                "45" : 5.6883,
                "59" : 4.792,
            ---etc---
            }

分钟集合每小时都有一个子文档,每分钟都有一个条目,其中包含该分钟的度量值。

我的问题是关于聚合框架,如果我想找到指标高于某个高水位线的所有分钟,我应该如何处理这个集合?调查聚合框架显示$ unwind函数,但这似乎只适用于数组..

map / reduce功能是否更适合这种情况?有了它,我可以简单地在高水位线上面发出任何条目并计算它们。

1 个答案:

答案 0 :(得分:0)

您可以使用reduce函数构建一个“键”数组,该函数遍历对象属性。

 reduce: function(obj,prev)
 {
    for(var key in obj.minute) {
        prev.results.push( { hour:key, minutes: obj.minute[key]});
    }
 }

会给你类似的东西

  {
          "results" : [
                  {
                          "hour" : "11",
                          "minutes" : {
                                  "33" : 4.689972,
                                  "32" : 4.7190895
                          }
                  },
                  {
                          "hour" : "3",
                          "minutes" : {
                                  "45" : 5.6883,
                                  "59" : 4.792
                          }
                  }
          ]
  }

我刚刚使用group()进行了快速测试 - 你需要更复杂的东西来迭代子文档(分钟),但希望能指出正确的方向。

db.yourcoll.group( {
initial: { results: [] }, reduce: function(obj,prev) { for(var key in obj.minute) { prev.results.push( { hour:key, minutes: obj.minute[key]}); } } } );

在终结器中,您可以再次重塑数据。它不会很漂亮,将分钟和小时数据保存为数组而不是文档的元素可能更容易。

希望它有所帮助