2014-01-28 56 views
2

我在學習如何使用Couchbase的地圖縮減功能。直到現在,我使用Where使用多項術語(添加和減去術語)並修改組部分來創建基於SQL的報表引擎。Couchbase Reduce功能

我正在嘗試使用視圖創建此報表引擎。

我的問題是如何創建一個報告,使用戶能夠潛入並找到越來越多的數據,獲取個人ip統計數據。例如, 。今天有多少點擊?哪個流量來源?他們看到了什麼?哪個國家 ?和等。

我在這個例子中基本的文檔是這樣的:

"1" 
{ 
"date": "2014-01-13 10:00:00", 
    "ip": "111.222.333.444", 
    "country": "US", 
    "source":"1", 
} 
"2" 
{ 
"date": "2014-01-13 10:00:00", 
    "ip": "555.222.333.444", 
    "country": "US", 
    "source":"1", 
} 
"3" 
{ 
"date": "2014-01-13 11:00:00", 
    "ip": "111.888.888.888", 
    "country": "US", 
    "source":"2", 
} 
"4" 
{ 
"date": "2014-01-13 11:00:00", 
    "ip": "111.777.777.777", 
    "country": "US", 
    "source":"1", 
} 

所以我想,讓用戶看到的第一個畫面,有多少點擊,每天也有在這個網站。 所以我需要計算點擊次數。簡單的地圖/減少: MAP:

function (doc, meta) { 
    emit(dateToArray(doc.date),1); 
} 
Reduce: 
_count 

組級別4,組真

將創建每小時點擊的總和。

現在,如果我想允許一個國家的分解,所以我需要一個動態的參數來改變..從我明白它只能由組級別.. 所以假設我已經添加到發射像這樣:

emit([dateToArray(doc.date),source],1); 

,然後分組5級將讓這道鴻溝,並使用該密鑰太專注於certein日期..但如果我需要添加一個縣打破?再次添加到發射? 這似乎是一個爛攤子,如果我想要做一個國家統計之前的來源..有沒有更聰明的方法來做到這一點?

第二部分...

,如果我想獲得第一計數如下:

[2014,1,28,10] {ip:"555.222.333.444","111.222.333.444","count":"2"} 

我希望看到所有的都算這一次的IPS ... 如何我應該寫我的減少功能嗎?

這是我那不工作的當前狀態..

function(key, values, rereduce) { 
    var result = {id: 0, count: 0}; 
    for(i=0; i < values.length; i++) { 
    if(rereduce) { 
     result.id = result.id + (values[i]).ip +','; 
     result.count = result.count + values[i].count; 
    } else { 
     result.id = values.ip; 
     result.count = values.length; 
    } 
    } 
    return result; 

我沒有得到答案的格式我一直在尋找..

我希望這不是令人眼花繚亂的,並且你能幫助我與此..

謝謝!!

回答

1

對於你的問題的第一部分,我認爲你是在正確的軌道上。這就是如何分解視圖以實現粗略挖掘。但是,重要的是要記住,視圖不是用來存儲整個文檔,也不一定能夠給你一個清晰的數據樣本。您可能需要在代碼的訪問層中進行精細過濾(也許使用Linq)。

對於問題的第二部分,減少不是實現此目的的適當機制。減少值的大小非常有限(並且有限),並且一旦它們變得太大,就會使地圖/減少引擎崩潰。我懷疑你已經嘗試過並自己發現了這一點。

您提到這個問題的方式,似乎您希望搜索所有已計入「X」次數的IP地址。這不能直接在Couchbase的map/reduce架構中完成;然而,如果你只是想要一個給定的IP地址的計數,這是地圖/減少框架內置(只使用日期+ IP作爲關鍵)。

+0

感謝這個答案,我試圖讓它只使用視圖的工作,我認爲彈性搜索服務器將能夠做到這一點與出問題。 –

+0

我正在建議Elasticsearch,但不知道這是否是您的選擇。 – theMayer