1

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

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 中这样做的方法。

所以我坚持在数据从地图减少后按摩数据,这不是那么有效并且容易出现舍入错误。谢谢!

4

1 回答 1

0

当你去形成报告时,这可能是最好的做法。

问题是这些行不存在,MR实际上不能在循环中随意形成新的文档,它只能修改输入的文档。

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

所以我坚持在数据从地图减少后按摩数据,这不是那么有效并且容易出现舍入错误

它不应该容易出错,如果操作正确,它应该与数据库一样准确,因为您使用的是客户端定义的(我假设)时间范围,并且您正在对分隔符进行分组,因此它不应该容易出错。

于 2012-12-04T10:22:02.230 回答