簡體   English   中英

在CouchDB中創建分頁索引?

[英]Creating a pagination index in CouchDB?

我正在嘗試在CouchDB中創建一個分頁索引視圖,該視圖列出找到的每N個文檔的doc._id。

我寫了下面的map函數,但是pageIndex變量不能可靠地從1開始-實際上,它似乎根據發射的值或索引長度(例如50、55、10、25)任意改變了-都以不同的開頭文件,盡管我似乎得到了發出的正確數量的文件)。

function(doc) {
  if (doc.type == 'log') {
    if (!pageIndex || pageIndex > 50) {
      pageIndex = 1;
      emit(doc.timestamp, null);
    }
    pageIndex++;
  }
}

我在這里做錯了什么? CouchDB專家將如何構建此視圖?

請注意,我不想使用其他地方提到的“ startkey + count + 1”方法,因為我希望能夠跳轉到特定頁面或最后一頁(用戶的期望和全部),所以我想d希望有一個友好的“?page = 5” URI而不是“?startkey = 348ca1829328edefe3c5b38b3a1f36d1e988084b”,我希望CouchDB可以完成此工作,而不是堆積我的應用程序。

謝謝!

視圖函數( mapreduce )純粹是功能。 不支持諸如設置全局變量的副作用。 (將應用程序移至BigCouch時 ,具有數據任意子集的多個獨立服務器如何知道pageIndex是什么?)

因此,答案將必須包含傳統的map功能,可能需要時間戳記。

function(doc) {
  if (doc.type == 'log') {
    emit(doc.timestamp, null);
  }
}

如何獲得第50個文檔? 最簡單的方法是添加skip=0skip=50skip=100參數。 但是,這並不理想(請參見下文)。

_list函數用於預提取第50個文檔的確切ID,該方法僅輸出第50行。 (實際上,您可以使用Mustache.JS或其他模板庫來構建HTML。)

function() {
  var ddoc = this,
      pageIndex = 0,
      row;

  send("[");
  while(row = getRow()) {
    if(pageIndex % 50 == 0) {
      send(JSON.stringify(row));
    }
    pageIndex += 1;
  }
  send("]");
}

這在很多情況下都可以使用,但是並不完美。 這是我在考慮的一些注意事項-不一定要顯示排行榜,但這取決於您的具體情況。

不鼓勵使用漂亮的URL是有原因的。 如果我加載第1頁,然后在前50個文檔中插入一堆文檔,然后單擊第2頁,那是什么意思? 如果數據變化很大,就沒有完美的用戶體驗,用戶必須以某種方式感覺到數據正在變化。

skip參數和_list示例函數具有相同的問題:它們無法縮放。 使用skip您仍然會從頭開始觸及視圖中的每一行:在數據庫文件中找到它,從磁盤中讀取它,然后一遍又一遍地逐行忽略它,直到達到skip值為止。 對於較小的值,這非常方便,但是由於您將頁面分為50組,因此我不得不想象您將有數千行或更多行。 這可能會使頁面瀏覽速度變慢,因為數據庫大多數時候都在運轉。

_list示例有一個類似的問題,但是您要_list加載所有工作,從頭到尾遍歷整個視圖,然后(大概)將相關文檔ID發送給客戶端,以便它可以在頁面之間快速跳轉。 但是對於成千上萬的文檔(您稱它們為“日志”,所以我認為您將擁有大量文件),這將是一個非常慢的查詢,不會被緩存。

總之,對於小型數據集,您可以使用page=1page=2形式,但是隨着數據集變大,您將遇到麻煩。 隨着BigCouch的發布,CouchDB甚至可以更好地進行日志存儲和分析,因此(如果您正在這樣做),您肯定會考慮擴展規模。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM