0

我有一些指标集合,它们预先聚合到小时和分钟集合中,如下所示:

"_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 功能会更适合这个吗?有了它,我可以简单地发出高于高水位线的任何条目并计算它们。

4

1 回答 1

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]}); } } } );

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

希望它有所帮助

于 2013-01-30T00:13:53.413 回答