代码之家  ›  专栏  ›  技术社区  ›  Andrew Childs

在CouchDB中创建分页索引?

  •  2
  • Andrew Childs  · 技术社区  · 16 年前

    我正在尝试在CouchDB中创建一个分页索引视图,列出找到的每个文档的doc.\u id。

    我编写了下面的map函数,但是 当前页 变量不能可靠地从1开始—事实上,它似乎会根据发出的值或索引长度任意更改(例如,50、55、10、25—所有变量都从不同的文件开始,尽管我似乎得到了正确的发出文件数)。

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

    mentioned elsewhere ,因为我希望能够跳转到某个特定页面或最后一个页面(用户期望和所有),我希望有一个友好的“?page=5“URI代替”?startkey=348ca1829328edefe3c5b38b3a1f36d1e988084b“,如果我能帮助的话,我宁愿CouchDB做这项工作,而不是扩充我的应用程序。

    谢谢!

    1 回复  |  直到 16 年前
        1
  •  6
  •   JasonSmith    16 年前

    查看函数( map 和 reduce )完全是功能性的。不支持设置全局变量等副作用。(当您将应用程序移动到 BigCouch pageIndex

    因此,答案将不得不涉及传统的 地图 函数,可能由时间戳键控。

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

    你怎么能拿到每50份文件?最简单的方法是添加 skip=0 或 skip=50 skip=100 参数。但这并不理想(见下文)。

    预取每个第50个文档的确切id的方法是 _list 只输出第50行的函数。(实际上你可以小胡子.JS或者另一个模板库来构建HTML。)

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

    有一个原因,漂亮的网址是不鼓励的。如果我加载第1页,然后在前50页中插入一堆文档,然后单击第2页,这意味着什么?如果数据变化很大,没有完美的用户体验,用户一定会感觉到数据的变化。

    skip _列表 你还在摸吗 每一个 视图中的行从头开始:在数据库文件中找到它,从磁盘中读取它,然后忽略它,一行一行地重复,直到点击 跳过

    这个 _列表

    总之,对于小数据集,您可以通过 page=1 , page=2