我该如何实现分页所需的查询呢?
基本上,当请求页面1时,获取前5个条目。对于第2页,获取下一个5页,依此类推。
我计划通过couchdb-python模块使用它,但这不会对实现造成任何影响。
发布于 2011-06-25 09:20:33
CouchDB Guide对分页进行了很好的讨论,包括大量示例代码,如下所示:http://guide.couchdb.org/draft/recipes.html#pagination这是他们的算法:
从视图中请求
rows_per_page + 1 rows_per_page行,将最后一行存储为代码页信息,保留startkey和next_*值以创建下一个链接,并使用其他值创建上一个链接<startkey>F217>
注:在CouchDB中获取页面的正确方法是指定起始键,而不是您可能认为的起始索引。但是你怎么知道从哪个键开始第二页呢?聪明的解决方案是:“不是为一个页面请求10行,而是请求11行,但只显示10行,并使用第11行中的值作为下一页的起始键。”
如果您希望多个文档发出相同的键,则除了startkey之外,还需要使用startdocid来正确分页。原因是startkey本身不再足以唯一地标识一行。如果不提供startkey,这些参数就毫无用处。实际上,如果多个潜在的起始行具有相同的键但文档ID不同,CouchDB将首先查看startkey参数,然后使用startdocid参数进一步重新定义范围的开始。enddocid也是如此。
发布于 2008-11-24 15:46:39
CouchDB HTTP View API为高效地进行分页提供了很大的空间。
最简单的方法是使用startkey和count。Count是CouchDB将为该视图请求返回的最大条目数,这取决于您的设计,startkey是您希望CouchDB开始的位置。当你请求视图时,它还会告诉你有多少个条目,允许你计算如果你想向用户显示有多少个页面。
因此,第一个请求不会指定startkey,而只是要显示的条目数量的计数。然后,您可以记下最后返回的条目的键,并将其用作下一页的起始键。在这个简单的表单中,您将得到一个重叠,其中一个页面的最后一个条目是下一个页面的第一个条目。如果这不是所希望的,那么简单地不显示页面的最后一项是微不足道的。
执行此操作的一种更简单的方法是使用skip参数计算出页面的起始文档,但是应谨慎使用此方法。跳过参数只是导致内部引擎不返回它正在迭代的条目。虽然这提供了所需的行为,但它比通过键查找页面的第一个文档要慢得多。跳过的文档越多,请求的速度就越慢。
发布于 2008-11-23 05:41:12
这就是我到目前为止想出的方法--获取所有帖子的is,然后检索前x个is的实际条目。
这并不是非常有效,但比起检索所有的帖子,然后丢弃大部分帖子要好得多。尽管如此,令我惊讶的是,它似乎运行得相当快-我运行了100次posthelper.page()方法,它花了大约0.5秒。
我不想在实际问题中张贴这篇文章,所以它不会对答案产生太大影响--代码如下:
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 rethttps://stackoverflow.com/questions/312163
复制相似问题