,聚合框架就无法遍历
我的收藏有这样的文档:
日
--小时
----分钟
其中每小时是一天的属性,每分钟是一小时的属性:
///first hour, first minute ... last hour, last minute
{
0: {0:{x:1, y:2}...59:{x:3, y:8}}
...
23: {0:{x:1, y:2}...59:{x:3, y:8}}
}
我想对分钟属性的值求平均值,以返回这样的文档集合:
//first hour, average values ... last hour, average values
{
0:{x:2, y:5}
...
23:{x:2, y:5}
}
我可以使用mapReduce或聚合管道来执行此操作吗?怎样
一个问题:我还想过滤出这样的预格式化分钟:
59: {x:0, y:0} // zero means null record
是的,这是直接的mapReduce逻辑,没有reducer。
所以考虑到你有这样的结构:
{
"series": {
0: { 0:{x:1, y:2}, 1: { x:0, y:0 }, 59:{x:3, y:8} },
23: { 0:{x:1, y:2}, 59:{x:3, y:8} }
}
}
然后定义一个映射器:
var mapper = function () {
var output = {};
for ( h in this.series ) {
var minutes = {x: 0, y: 0};
var count = 0;
for ( m in this.series[h] ) {
if ( ( this.series[h][m].x != 0 ) &&
( this.series[h][m].y != 0 ) )
{
minutes.x += this.series[h][m].x;
minutes.y += this.series[h][m].y;
count++;
}
}
minutes.x = Math.floor( minutes.x / count );
minutes.y = Math.floor( minutes.y / count );
output[h] = minutes;
}
emit( this._id, output );
};
然后运行mapReduce:
db.series.mapReduce(mapper,function(){},{ out: { inline: 1 } })
这会给你输出:
"results" : [
{
"_id" : ObjectId("53618345e10ce3c73df3ff24"),
"value" : {
"0" : {
"x" : 2,
"y" : 5
},
"23" : {
"x" : 2,
"y" : 5
}
}
}
],
并将对每个文档执行此操作。
在您当前的结构中,使用聚合框架进行转换是不可能的,因为所有元素都是子文档,如果不显式地将每个元素命名为