我将如何实现分页所需的查询?
基本上,当请求第1页时,获取前5个条目.对于第2页,获取下一个5,依此类推.
我计划通过couchdb-python模块使用它,但这不会对实现产生任何影响.
该CouchDB的指南具有分页的一个很好的讨论,其中包括大量的示例代码,在这里:http://guide.couchdb.org/draft/recipes.html#pagination 这里是他们的算法:
请求rows_per_page + 1
视图中的行
显示rows_per_page
行,将最后一行存储为next_startkey
作为页面信息,请保持startkey
和next_startkey
使用这些next_*
值创建下一个链接,并使用其他链接创建上一个链接
注意:在CouchDB中获取页面的正确方法是指定一个起始键,而不是像你想象的那样的起始索引.但是你怎么知道开始第2页的关键是什么?聪明的解决方案:"不是为页面请求10行,而是请求11行,但只显示10行,并使用第11行中的值作为下一页的开始键."
如果您希望多个文档发出相同的密钥,则startdocid
除了startkey
正确分页外,还需要使用它们.原因是startkey
单独不再足以唯一地识别行.如果您不提供,那么这些参数是无用的startkey
.事实上,CouchDB将首先查看startkey
参数,然后startdocid
如果多个潜在的凝视行具有相同的密钥但文档ID不同,它将使用该参数进一步重新定义范围的开头.同样的事情enddocid
.
CouchDB HTTP View API提供了足够的范围来有效地进行分页.
最简单的方法是使用startkey
和count
.Count是CouchDB将为该视图请求返回的最大条目数,这取决于您的设计,startkey是您希望CouchDB启动的位置.当您请求视图时,它还会告诉您有多少条目,允许您计算如果要向用户显示该条目的页数.
因此,第一个请求不会指定启动键,只会指定要显示的条目数.然后,您可以记下返回的最后一个条目的键,并将其用作下一页的开始键.在这个简单的表单中,您将获得重叠,其中一个页面的最后一个条目是下一个页面的第一个条目.如果这不可取,那么简单地不显示页面的最后一个条目是微不足道的.
更简单的方法是使用skip参数计算页面的起始文档,但是应谨慎使用此方法.skip参数只是导致内部引擎不返回它正在迭代的条目.虽然这给出了期望的行为,但它比按键查找页面的第一个文档慢得多.跳过的文档越多,请求就越慢.