mapReduce或聚合嵌套属性的平均值



我的收藏有这样的文档:

--小时

----分钟

其中每小时是一天的属性,每分钟是一小时的属性:

///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
                            }
                    }
            }
    ],

并将对每个文档执行此操作。

在您当前的结构中,使用聚合框架进行转换是不可能的,因为所有元素都是子文档,如果不显式地将每个元素命名为

,聚合框架就无法遍历

相关内容

  • 没有找到相关文章

最新更新