2010-06-21 53 views
7

我在CouchDB分頁中看到的大多數研究表明,您需要做的是從視圖中獲取前十個(或多個)項目,然後記錄最後一個文檔的docid並將其傳遞到下一頁。不幸的是,我可以看到這種方法的一些明顯的問題。CouchDB中無狀態分頁?

  • 它顯然使得它不可能在一組頁面內四處跳躍(如果有人直接跳到100頁,你就必須運行2-99頁的查詢,這樣你就知道如何加載100頁) 。
  • 它需要你在頁面之間傳遞很多狀態信息。
  • 很難正確編碼。

不幸的是,my research表明,使用skip開發數據集的5000條記錄或更大的顯着減緩,並會積極沉重的,一旦你達到什麼真正的巨大的(要20000頁10條記錄到一個頁面需要大約20秒 - 是的,有數據集生產大)。所以這不是一個真正的選擇。

所以,我問的是,有沒有一種有效的方式來分頁查看結果在CouchDB中,可以從任意頁面獲取所有項目? (我使用couchdb-python,但希望沒有任何關於這將取決於客戶端。)

回答

3

我是CouchDB的新手,但我想我可以幫忙。我讀了CouchDB的以下內容:權威指南

鏈表風格分頁的

一個缺點是,...跳轉到一個特定的頁面並沒有真正的工作......如果你真的需要跳轉到所有文檔的頁面......您仍然可以維護一個整數值索引作爲視圖索引,並採用混合方法來解決分頁問題。
      — http://books.couchdb.org/relax/receipts/pagination

如果我讀的是正確的,你的情況的做法將是:

  1. 嵌入數字序列爲您的文檔集。
  2. 將數字序列提取到數字視圖索引。
  3. 使用算術計算任意頁面的正確開始/結束數字鍵。

對於第1步,您需要實際添加諸如「page_seq」之類的字段作爲文檔。對於您如何獲得此號碼我沒有具體的建議,並且很想知道人們的想法。爲了使這個方案起作用,每個新記錄必須增加1,所以RDBMS序列可能不存在(我熟悉的可能會跳過數字)。

對於第2步,你會寫一個映射函數就是這樣的事情(在Javascript)一個觀點:

function(doc): 
    emit(doc.page_seq, doc) 

對於第3步,你會寫你的查詢是這樣的(假設page_seq和頁碼序列從1開始):

results = db.view("name_of_view") 
page_size = ... # say, 20 
page_no = ... # 1 = page 1, 2 = page 2, etc. 
begin = ((page_no - 1) * page_size) + 1 
end = begin + page_size 
my_page = results[begin:end] 

然後您可以遍歷my_page。

一個明顯的缺點是page_seq假設你不過濾數據集爲您的視圖,你很快就會遇到麻煩,如果你試圖讓這個以任意的查詢工作。

評論/改進的歡迎。

1

我們通過使用CouchDB的Lucene的搜索列表解決了這個問題。 0.6快照是足夠穩定你應該嘗試一下:

​​