2012-12-03 34 views
1

我有地图减少由日期分组:是否可以在Mongodb的地图缩小中填充零?

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

因此,我卡住按摩数据后,它出来的地图减少,这是不是很有效,并容易舍入误差。谢谢!

+0

嗨,你是如何解决这个问题的?我面对完全相同的问题。 – Pod

回答

0

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

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

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

所以我坚持按摩数据弄出来的地图后减少是不是很有效,容易出现舍入误差

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

+0

脆弱的部分是时间戳是整数。如果你尝试按天或小时分组,你会得到稀疏的时间戳。这很容易出错,并试图在头上打入整数(用时区来改变任何事情)。我最终在Javascript日期中调用'toDateString()'来把它变成一些不可能搞砸的东西。但是我仍然没有找到一种优雅的方式来在所有的日子里得到零。我坚持在地图缩小之后迭代数据,这并不令人感觉超高效,但是可行。无论如何,谢谢你看看。 –

+0

您可以通过制定标准化时间来解决这个问题,即您可以使所有int时间戳从当天的UTC时间开始,然后在匹配后更改时区,因此您始终在标准时间内查询,而永远不会在用户时间内查询当天的第2小时。这是大多数人理智的方式。在MongoDB中如何做统计信息有几个链接,快速谷歌搜索会带来它们 – Sammaye