2010-06-27 112 views
1

我想使用CouchDB視圖API在應用程序級別創建分頁。分頁使用遊標,因此如果給定遊標,我將查詢以給定遊標作爲開始鍵開始的n+1文檔的視圖,並將n結果作爲頁面輸出,並提供n+1結果行作爲下一頁的遊標。CouchDB分頁按日期排序,按ID查詢

只要視圖鍵也是我的視圖行的鍵,這很有效。現在這次我所有的文檔都有一個日期字段,並將它們作爲地圖鍵發出,因爲我想通過日期進行排序。但是,我不能再像以前那樣使用我的遊標了。

我認爲這就是視圖API也提供startkey_docid提交這樣一個光標doc id的原因,但是這顯然不是真實的。看起來這個值只適用於每個鍵有幾個相等的行。

因此,簡而言之:我想要一個按日期排序的視圖,但是基於文檔id的遊標。我怎樣才能做到這一點?

在此先感謝

Simplified view 

function map(doc) 
{ 
    emit(doc.date, {_id: doc._id}); 
} 


Simplified view result: 

{ 
"rows":[ 
    {"id":"123","key":"2010-06-26T01:28:13.555Z", value:{...}}, 
    {"id":"234","key":"2010-06-22T12:21:23.123Z", value:{...}}, 
    {"id":"987","key":"2010-06-16T13:48:43.321Z", value:{...}}, 
    {"id":"103","key":"2010-05-01T17:38:31.123Z", value:{...}}, 
    {"id":"645","key":"2009-07-21T21:21:13.345Z", value:{...}} 
] 
} 

Application-level query with cursor 234, page size 3 should return: 
    234, 987, 103 

所以,我怎麼能這樣映射到一個看法?

回答

1

爲什麼你想要基於docid的遊標?

Map Reduce創建單維索引,因此任何非鍵遍歷都將很昂貴。不過,我認爲你可以做到你想要的,而不需要同時遍歷2個索引。

例如,見我這裏怎麼分頁通過具有一定標籤的帖子:

Sofa's CouchApp tag pagination

又名

http://jchris.couchone.com/sofa/_design/sofa/_list/index/tags?descending=true&reduce=false&limit=10&startkey=[%22life%22%2C {}] & endkey = [%22life%22]

該視圖中的關鍵看起來像[「tag」,「2008/10/25 04:49:10 +0000」],因此您可以通過標記和標記內的時間分頁。

編輯

哈!我剛剛意識到你正在努力做什麼。它非常簡單。

忘記所有關於docid的內容,它們應該是隨機的,而且與任何內容都沒有關係,所以只要忘記docs,甚至有一秒鐘的id。

你說「用光標234,頁面大小3應用程序級別的查詢應該返回: 234,987,103」

你的光標不應該是234.這應該是關鍵「2010-06-22T12 :21:23.123Z」。

所以本質上你使用最後一行結果的關鍵字作爲下一個查詢的開始鍵。因此,例如startkey =「」2010-06-22T12:21:23.123Z「」& limit = 3,那麼對於您渲染的每個頁面,鏈接到一個查詢,其中新的startkey是最後返回的鍵。

獎金:通過我剛剛描述的內容,您可以將第2頁的底部行作爲第3頁的第一行。要解決這個問題,請在查詢中添加skip = 1。

紅利獎勵:好的,當我有超過3個文檔發佈到視圖中的同一個鍵時,該怎麼辦?然後最後一個鍵將始終與第一個鍵相同,因此如果不擴展限制參數,則無法進行分頁。除非...使用startkey_docid(並將其設置爲最後一行的ID)。這是您唯一應該使用startkey_docid的時間。

+0

嗯,你的標籤用例略有不同。但要採取博客的例子。想想擁有日期的博客條目。您知道按日期排序的條目分類,而不使用因性能原因應避免的限制/跳過模式。 – 2010-06-27 22:48:10

+0

哦,我想用遊標而不是頁碼的原因是因爲它們是無狀態的。這對我的REST用例是必需的。 – 2010-06-27 22:50:48

+0

「只要視圖鍵也是我的視圖行的鍵,就可以很好地工作。」 這是你在原始問題上丟失了我的部分。這可能是一個讓事情比它更復雜的例子。 這裏只是按日期分類: http://jchris.couchone.com/sofa/_design/sofa/_list/index/recent-posts?descending=true&limit=10 – 2010-06-27 22:51:07