是否有可能在Mongodb mapreduce中填充零?

时间:2012-12-03 21:40:58

标签: mongodb mapreduce

我有一个按日期分组的地图缩小:

map = %Q{
  function() {
    var rounded_time = this.created_at;
    rounded_time.setHours(0,0,0,0);
    emit(rounded_time.getTime() / 1000, this.total);
  }
}

reduce = %Q{
  function(key, values) {
    var result = 0;
    values.forEach(function(value) {
      result += value;
    });
    return result;
  }
}

data = Order.map_reduce(map, reduce).out(inline: true)

但当然有些日期没有任何订单,因此它们不会出现在结果中。这被送入时间序列图表,因此在那些日子里有零会很好。

我想知道是否有一种干净的方法用零填写缺少的日期。似乎在每个日期做一个初始emit(time, 0)将是单向的,但我还没有看到在mongo中做到这一点的方法。

因此,当数据从地图中减少时,我无法对数据进行按摩,这不是很有效且容易出现舍入错误。谢谢!

1 个答案:

答案 0 :(得分:0)

当你去编写报告时,这可能是最好的。

问题是那些行不存在且MR无法在循环中随意形成新文档,它只能修改输入到它的文档。

因此,当您在图表中迭代文档时,您很可能会知道您在搜索的时间序列(日,月,年)中使用的分隔符,并且可以轻松修改数据以在这些点添加0值缺少的。一般来说,最好的方法是不要在循环中滚动光标来制作图形,而是滚动日期列表,然后从光标中获取该日期或在其中放置零值。

  

所以我在数据从地图缩小后停止按摩,这不是那么有效且容易出现舍入错误

它应该不容易出错,如果做得正确,它应该像数据库那样准确,因为你使用的是客户定义的(我假设)时间范围而且你正在对分隔符进行分组,所以它不应该是容易出错。