2011-10-12 19 views
2

我正在將一個應用程序從mySQL遷移到couchDB。 (好的,請不要通過判斷)。如何爲以下情況設計couchdb視圖?

沒有與簽名功能

getUserBy($column, $value) 

現在你可以看到,在SQL的情況下,它是一個很簡單的工作,構建查詢並啓動它。

但是至於CouchDB的關注,我應該寫地圖功能的觀點

目前,我有諸如

get_user_by_name 
get_user_by_email 

等很多意見。任何人都可以提出一個更好,但可擴展的方式做到這一點?

回答

3

當然!我最喜歡的一個觀點是,它的力量是by_field。這是一個非常簡單的地圖功能。

function(doc) { 
    // by_field: map function 
    // A single view for every field in every document! 
    var field, key; 

    for (field in doc) { 
     key = [field, doc[field]]; 
     emit(key, 1); 
    } 
} 

假設您的文件有.name場爲他們的名字,併爲.email他們的電子郵件地址。

按名稱獲取用戶(例如 「愛麗絲」 和 「鮑勃」。):

GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Alice"] 
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Bob"] 

通過電子郵件獲得的用戶,從同樣的觀點:

GET /db/_design/example/_view/by_field?include_docs=true&key=["email","[email protected]"] 
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","[email protected]"] 

我喜歡它的原因發出1就是這樣您可以稍後編寫reduce函數,以便使用sum()輕鬆地合併與您的查詢匹配的文檔。

+0

這就是我如何解決這個問題,但我擔心的是可擴展性。對於每個具有m個字段的n個文檔,它將輸出大約n * m行。我不熟悉CouchDB的內部,但作爲一個MySQL的傢伙,我不知道這是否會花費很長時間。 –

+2

最初調用視圖可能需要一些時間,但視圖結果被緩存,因此只有在更新查詢視圖時才考慮更新的文檔。 – grefab

+0

另外,如果你不需要每個字段輸出,你可以修改上面的「by_field」MapReduce,只輸出你感興趣的字段(在你的計劃中)。在你的n * m等式中,m是數字你關心的領域。也就是說,讓它「廣泛開放」確實會給你更多的靈活性,但是視圖索引使用的磁盤空間(儘管相對較少)會有更多的磁盤空間(gre提到的結果緩存)。 – BigBlueHat

相關問題