2012-12-03 61 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