CouchDB中的无状态分页?

Lea*_*orm 7 python pagination couchdb

我在与CouchDB分页时看到的大部分研究表明,您需要做的是从您的视图中获取前十个(或多个)项目,然后记录最后一个文档的docid并将其传递到下一页.不幸的是,我可以看到该方法的一些明显问题.

  • 它显然使得无法在页面集中跳过(如果有人直接跳到页面100,您将不得不运行第2-99页的查询,因此您将知道如何加载页面100).
  • 它要求您在页面之间传递可能的大量状态信息.
  • 正确编码很困难.

不幸的是,我的研究表明,使用skip5000个记录或更大的数据集会大大减缓,一旦你到达任何真正巨大的东西,就会出现严重的瘫痪(对于一个页面,有10个记录的页面20000将花费大约20秒 - 是的,那里是生产中的大数据集).所以这不是一个真正的选择.

那么,我要问的是,有没有一种有效的方法来分页CouchDB中的视图结果,可以从任意页面获取所有项目?(我正在使用couchdb-python,但希望没有任何与客户端相关的内容.)

Owe*_* S. 3

我是 CouchDB 的新手,但我想我也许可以提供帮助。我从《CouchDB:权威指南》中阅读了以下内容:

\n\n
\n

链表样式分页的一个缺点是...跳转到特定页面并不能真正起作用...如果您确实需要跳转到整个文档范围的页面...您仍然可以维护整数值索引作为视图索引,并采用混合方法来解决分页问题。
   — http://books.couchdb.org/relax/receipts/pagination

\n
\n\n

如果我没看错的话,你的案例的方法将是:

\n\n
    \n
  1. 将数字序列嵌入到您的文档集中。
  2. \n
  3. 将该数字序列提取到数字视图索引。
  4. \n
  5. 使用算术计算任意页面的正确开始/结束数字键。
  6. \n
\n\n

对于第 1 步,您需要实际将“page_seq”之类的内容作为字段添加到文档中。我没有关于如何获得这个数字的具体建议,并且很想知道人们的想法。为了让这个方案发挥作用,它必须为每个新记录精确地增加 1,因此 RDBMS 序列可能会被淘汰(我熟悉的序列可能会跳过数字)。

\n\n

对于第 2 步,您将编写一个带有地图函数的视图,如下所示(在 Javascript 中):

\n\n
function(doc):\n    emit(doc.page_seq, doc)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于第 3 步,您可以像这样编写查询(假设 page_seq 和页编号序列从 1 开始):

\n\n
results = db.view("name_of_view")\npage_size = ... # say, 20\npage_no = ... # 1 = page 1, 2 = page 2, etc.\nbegin = ((page_no - 1) * page_size) + 1\nend = begin + page_size\nmy_page = results[begin:end]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你可以迭代 my_page.

\n\n

这样做的一个明显缺点是 page_seq 假设您没有过滤视图的数据集,如果您试图让它与任意查询一起使用,您很快就会遇到麻烦。

\n\n

欢迎提出意见/改进。

\n