首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CouchDB中的分页?

CouchDB中的分页?
EN

Stack Overflow用户
提问于 2008-11-23 05:37:17
回答 4查看 16.7K关注 0票数 46

我该如何实现分页所需的查询呢?

基本上,当请求页面1时,获取前5个条目。对于第2页,获取下一个5页,依此类推。

我计划通过couchdb-python模块使用它,但这不会对实现造成任何影响。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-25 09:20:33

CouchDB Guide对分页进行了很好的讨论,包括大量示例代码,如下所示:http://guide.couchdb.org/draft/recipes.html#pagination这是他们的算法:

从视图中请求

  • rows_per_page + 1
  • 显示rows_per_page行,将最后一行存储为代码页信息,保留startkeynext_*值以创建下一个链接,并使用其他值创建上一个链接

<startkey>F217>

注:在CouchDB中获取页面的正确方法是指定起始键,而不是您可能认为的起始索引。但是你怎么知道从哪个键开始第二页呢?聪明的解决方案是:“不是为一个页面请求10行,而是请求11行,但只显示10行,并使用第11行中的值作为下一页的起始键。”

如果您希望多个文档发出相同的键,则除了startkey之外,还需要使用startdocid来正确分页。原因是startkey本身不再足以唯一地标识一行。如果不提供startkey,这些参数就毫无用处。实际上,如果多个潜在的起始行具有相同的键但文档ID不同,CouchDB将首先查看startkey参数,然后使用startdocid参数进一步重新定义范围的开始。enddocid也是如此。

票数 35
EN

Stack Overflow用户

发布于 2008-11-24 15:46:39

CouchDB HTTP View API为高效地进行分页提供了很大的空间。

最简单的方法是使用startkeycount。Count是CouchDB将为该视图请求返回的最大条目数,这取决于您的设计,startkey是您希望CouchDB开始的位置。当你请求视图时,它还会告诉你有多少个条目,允许你计算如果你想向用户显示有多少个页面。

因此,第一个请求不会指定startkey,而只是要显示的条目数量的计数。然后,您可以记下最后返回的条目的键,并将其用作下一页的起始键。在这个简单的表单中,您将得到一个重叠,其中一个页面的最后一个条目是下一个页面的第一个条目。如果这不是所希望的,那么简单地不显示页面的最后一项是微不足道的。

执行此操作的一种更简单的方法是使用skip参数计算出页面的起始文档,但是应谨慎使用此方法。跳过参数只是导致内部引擎不返回它正在迭代的条目。虽然这提供了所需的行为,但它比通过键查找页面的第一个文档要慢得多。跳过的文档越多,请求的速度就越慢。

票数 13
EN

Stack Overflow用户

发布于 2008-11-23 05:41:12

这就是我到目前为止想出的方法--获取所有帖子的is,然后检索前x个is的实际条目。

这并不是非常有效,但比起检索所有的帖子,然后丢弃大部分帖子要好得多。尽管如此,令我惊讶的是,它似乎运行得相当快-我运行了100次posthelper.page()方法,它花了大约0.5秒。

我不想在实际问题中张贴这篇文章,所以它不会对答案产生太大影响--代码如下:

代码语言:javascript
复制
allPostsUuid = """
function(doc) {
if(doc.type == 'post'){
    emit(doc._id, null);
}
}
"""

class PostsHelper:
    def __init__(self):
        server = Server(config.dbhost)
        db = server[config.dbname]
        return db


    def _getPostByUuid(self, uuid):
        return self.db.get(uuid)

    def page(self, number = 1):
        number -= 1 # start at zero offset
        start = number * config.perPage
        end = start + config.perPage

        allUuids = [
            x.key for x in self.db.query(allPostsUuid)
        ]
        ret = [
            self._getPostByUuid(x) for x in allUuids[start : end]
        ]

        if len(ret) == 0:
            raise Error404("Invalid page (%s results)" % (len(allUuids)))
        else:
            return ret
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/312163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档