2014-09-12 38 views
2

我想設計一個我們可以用於分析的couchdb地圖函數,我們的地圖函數看起來像這樣。可以發射鍵在數組的開始有可選的數組參數嗎?

function (doc) { 
    var t; 
    var year; 
    var date; 
    var month; 

    var hours, minutes, seconds, milliSeconds; 
    if (doc.time && doc.zone && doc.user && doc.companyCode) { 
     t = new Date(Date.parse(doc.time)); 
     year = t.getFullYear(); 
     month = t.getMonth() + 1; 
     date = t.getDate(); 


     milliSeconds = t.getMilliseconds(); 
     //We emit this in the same sequence for group level queries. 
     emit([doc.companyCode, doc.zone, doc.user, doc.eventtype, year, month, date], 1); 
    } 

} 

我正在使用組級別,它工作得很好。

我想知道的是 - 我可以保留區域可選在這個或用戶可選 這裏是一些我想問這個地圖/減少的查詢。

1)2014年公司,區域和用戶的所有事件是什麼? - 通過保留一些時間參數是可選的,現在可以做到這一點。

2)我們可以問相同的查詢某一年的事件是什麼?我想在2014年找出公司代碼的事件。我想讓區域和用戶可選。

3)保持這些指標分開的優點和缺點是什麼?還是應該? :)

回答

2

要得到你的結果你想要範圍查詢。

1)2014年公司,區域和用戶的所有事件是什麼? - 通過保留一些時間參數可選,現在可以做到這一點。

?startkey=["company","zone","user","event",2014]&endkey=["company", "zone", "user", "event", 2014,{},{}]

,這將讓你在2014年

我們可以問相同的查詢什麼是某年的事件爲一家公司,區和用戶的所有事件?我想在2014年找出公司代碼的事件。我想讓區域和用戶可選。

當然這裏去

?startkey=["company",null,null,null,2014]&endkey=["company", {}, {}, {}, 2014,{},{}]

,這應該給你一個公司代碼和2014年

3)有什麼優點VS缺點,以保持這些索引事件分離。還是應該? :)

這是一個難以回答的問題。我唯一能說的就是您的索引應該回答您的具體問題。例如,根據您對上述索引提出的問題,我會說您已經設計了好的索引,並且不需要將它們拆分。

那麼什麼是壞指數?

同樣的道理,一個不好的索引是一個不確定的索引。它試圖回答很多問題,並且在任何問題上都做得不好。例如有在分裂你的設計沒有點到

  1. 公司和日期指標
  2. 區和日期指標
  3. 用戶和日期指標

,然後彙總後的結果自己查詢他們三個人。單獨的所有三個指標對你來說都是無用的(假設),但只有當你彙總結果時你纔會得到一些有意義的結果。所以在這種情況下,您的單一索引方法要好得多。

但我想你想知道更多關於性能的含義。多個索引意味着會使用更多的磁盤空間。如果你在設計文檔中拆分索引,甚至可以達到一定程度的並行性,因爲每個設計文檔都將作爲一個單獨的過程來執行。但是,除非該索引回答了你想要回答的問題,否則不要創建它。

一個小建議。我偶然發現了@JasonSmith的這個answer,他在這裏提供了一些關於如何定位發射鍵的好建議。我認爲你可以在那裏改善你的排放結構。

+1

謝謝您的詳細消息。之後我會執行並將其標記爲答案。 – 2014-09-12 18:39:05

相關問題