当前位置:  开发笔记 > 前端 > 正文

在CouchDB中创建分页索引?

如何解决《在CouchDB中创建分页索引?》经验,为你挑选了1个好方法。

我正在尝试在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"方法,因为我希望能够跳转到特定页面或最后一页(用户期望和所有),我我希望有一个友好的"?page = 5"URI而不是"?startkey = 348ca1829328edefe3c5b38b3a1f36d1e988084b",我宁愿CouchDB完成这项工作,而不是填补我的应用程序,如果我能帮助它.

谢谢!



1> JasonSmith..:

视图函数(mapreduce)纯粹是功能性的.不支持设置全局变量等副作用.(当您将应用程序移动到BigCouch时,具有任意数据子集的多个独立服务器如何知道它是什么pageIndex?)

因此,答案必须涉及传统map功能,可能由时间戳键入.

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

你怎么能得到每50个文件?最简单的方法是添加skip=0or skip=50skip=100参数.然而,这并不理想(见下文).

预取每个第50个文档的确切ID的方法是_list仅每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("]");
}

这适用于许多情况,但并不完美.以下是我正在考虑的一些注意事项 - 不一定是showstoppers,但这取决于您的具体情况.

不鼓励使用漂亮的URL.如果我加载第1页,然后在前50个中插入一堆文档,然后点击第2页,这意味着什么?如果数据变化很大,没有完美的用户体验,用户必须以某种方式感受到数据的变化.

skip参数例如_list功能有同样的问题:他们并不规模.随着skip你还在抚摸行从头开始的观点:在数据库文件中找到它,从磁盘读取它,然后忽略它,一遍又一遍,逐行,直到你打的skip值.对于非常方便的小值,但由于您将页面分组为50个,我必须想象您将拥有数千或更多行.这可能会导致页面浏览速度变慢,因为数据库大部分时间都在转动轮子.

_list示例有一个类似的问题,但是您需要预先加载所有工作,从头到尾运行整个视图,并且(可能)将相关文档ID发送到客户端,以便它可以快速跳转到页面.但是有成千上万的文件(你称之为"日志",所以我假设你会有一吨),这将是一个非缓慢的查询,不会被缓存.

总之,对于小型数据集,您可以使用表单,但是随着数据集变大page=1,page=2您将遇到问题.随着BigCouch的发布,CouchDB甚至可以更好地用于日志存储和分析(如果这就是你正在做的事情),你肯定会想要考虑有多高.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有