我有几个指标集合预先汇总到小时和分钟集合中,如下所示:
"_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功能是否更适合这种情况?有了它,我可以简单地在高水位线上面发出任何条目并计算它们。
答案 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]});
}
}
}
);
在终结器中,您可以再次重塑数据。它不会很漂亮,将分钟和小时数据保存为数组而不是文档的元素可能更容易。
希望它有所帮助