分页在CouchDB?

我将如何去执行分页所需的查询?

基本上,当请求页面1时,获得前5个条目。 对于第2页,得到下一个5等等。

我打算通过couchdb-python模块来使用它,但是这对实现没有任何影响。

CouchDB指南有很好的分页讨论,包括很多示例代码,在这里: http : //guide.couchdb.org/draft/recipes.html#pagination这里是他们的algorithm:

  • 从视图请求rows_per_page + 1
  • 显示rows_per_page行,将最后一行存储为next_startkey
  • 作为页面信息,请保存startkeynext_startkey
  • 使用next_*值创build下一个链接,并使用其他链接创build上一个链接

注意:在CouchDB中获取页面的正确方法是指定一个起始键,而不是像你想象的那样起始索引。 但你怎么知道开始第二页的关键? 聪明的解决scheme:“而不是请求10行的页面,您请求11行,但只显示10,并使用第11行的值作为下一页的启动键。

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

CouchDB HTTP View API提供了大量的范围来高效地进行分页。

最简单的方法是使用startkeycount 。 计数是CouchDB将针对该查看请求返回的最大条目数,这取决于您的devise,startkey是您希望CouchDB启动的位置。 当你请求视图时,它也会告诉你有多less条目,允许你计算出有多less页面,如果你想要显示给用户。

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

更简单的方法是使用skip参数来计算页面的起始文档,但是应谨慎使用此方法。 skip参数只是简单地使内部引擎不返回正在迭代的条目。 虽然这给出了所需的行为,但它比按键find页面的第一个文档要慢得多。 越多的文档被跳过,请求将越慢。

这是我到目前为止 – 获取所有职位的ID,然后检索第一个X号码的实际项目..

这不是非常有效,但更多的是检索所有的职位,然后扔掉大部分。 这就是说,令我惊讶的是,它似乎运行得非常快 – 我跑了posthelper.page()方法100次,大约需要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 ret