2011-04-02 69 views
2

我充滿了時間標記的文檔的CouchDB數據庫,以便給定文檔的格式是這樣返回唯一的值數組的CouchDB的觀點:創建從一個文檔設置

{ id: "uniqueid", 
    year: 2011, 
    month: 3, 
    day: 31, 
    foo: "whatever" 
    bar: "something else" 
} 

我會喜歡構造一組視圖,以便給定的鍵將返回文檔所在的年,月或日值的數組。例如,給定視圖名稱Days,我想下面的視圖URL

/db/_design/designdoc/_view/Days?key=[2011,3] 

在三月份回到2011年該文件存在的所有日子的數組。舉例來說,如果2011年3月曾掉落六天文檔一些數字,它可能看起來像:

[1, 2, 5, 15, 27, 31] 

同樣,

/db/_design/designdoc/_view/Months?key=2011 

如果2011有掉落在四月,五月的文檔一些號碼,和9月,它可能看起來像:

[4, 5, 9] 

而且

/db/_design/designdoc/_view/Years 

將在整個數據庫中返回一個數組。如果文件今年和去年都有,它可能看起來像:

[2010, 2011] 

我推測它是很難寫一個reduce函數,因爲你最終運行到減少溢出錯誤的文件數的增加,返回數組。我知道這一點,因爲我編寫了一個可以工作的reduce函數,但是在我用文檔加載後,開始拋出溢出錯誤。

一個解決方案我已經研究只是創建一個視圖沒有減少使用創建的視圖startkeyendkey參數返回文檔的數組鍵[year, month, day]然後。這種方法的問題在於它如何擴展。假設我的數據庫擁有數以千計的文件分散在兩年以上。使用這個視圖,我需要遍歷整個文檔集才能發現它。

我相信this question試圖問同樣的事情,雖然我不太確定所以我想我會添加一個新的問題。此外,就這個問題給出的答案並不能避免減少大型文檔集的溢出錯誤,就我所能看到的有限視圖寫作技巧而言。

+0

我對這個問題的答案已被打破。對不起。 [我已更新](http://stackoverflow.com/questions/5456682/return-unique-values-by-key-in-couchdb/5476831#5476831),請再看一看。 – 2011-04-03 11:58:59

+0

我想了解你的問題。我編輯它以顯示預期的輸出。我的理解是否正確?如果是這樣,我會寫一個答案。謝謝。 – JasonSmith 2011-04-04 05:23:28

+0

@jhs,是的,這是正確的。感謝您使它更加清晰。 – stand 2011-04-04 06:17:29

回答

1

我認爲這一點,你需要構建你的意見不僅與地圖,但也與reduces

0

無視最終的縮放問題,有兩種解決方案。由於「月份」和「年份」的答案類似,因此我只會考慮天數。

解決方案1:

視圖天數:

地圖:

function(doc) { 
    if (doc.year && doc. month && doc.day) { 
     emit([ year, month, day ], 1); 
    } 
} 

減少:

function(keys, values) { 
    return sum(values); 
} 

列表listDays:

function(head, req) { 
    start({ 
     "headers": { 
      "Content-Type": "text/plain" 
     } 
    }); 
    var row; 
    var days = new Array(); 
    while(row = getRow()) { 
     days.push(row.key[2]); 
    } 
    var daysString = json.join(','); 
    send('[' + daysString + ']'); 
} 

HTTP調用:

http://couch/db/_design/db/_list/listDays/Days?group=true&group_level=2&startkey=["2011","3"]&endkey=["2011","3Z"] 

解決方案2:

視圖天:

地圖:

function(doc) { 
    if (doc.year && doc. month && doc.day) { 
     emit([ year, month, day ], null); 
    } 
} 

列表listDays:

function(head, req) { 
    start({ 
     "headers": { 
      "Content-Type": "text/plain" 
     } 
    }); 
    var row; 
    var days = new Array(); 
    while(row = getRow()) { 
     if (days.indexOf(row.key[2] == -1) { days.push(row.key[2]); } 
    } 
    var daysString = json.join(','); 
    send('[' + daysString + ']'); 
} 

http呼叫:

http://couch/db/_design/db/_list/listDays/Days?startkey=["2011","3"]&endkey=["2011","3Z"] 
+0

謝謝!我會看看這個,並讓你知道它是如何工作的。 – stand 2012-08-18 00:41:15

+0

請注意,我以「自由風格」編寫了代碼。我希望沒有錯誤:) – 2012-08-18 07:06:24