gpt4 book ai didi

python - CouchDB 中的无状态分页?

转载 作者:太空狗 更新时间:2023-10-29 21:53:44 24 4
gpt4 key购买 nike

我看到的关于 CouchDB 分页的大部分研究表明,您需要做的是从您的 View 中取出前十个(或任意多个)项目,然后记录最后一个文档的 docid 并将其传递给下一个页。不幸的是,我发现该方法存在一些明显的问题。

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

不幸的是,my research已经表明,使用 skip 会显着降低 5000 条记录或更大的数据集的速度,并且一旦您达到任何真正巨大的东西(进入 20000 页,每页有 10 条记录将花费大约 20 秒 -是的,生产中有很大的数据集)。所以这不是一个真正的选择。

所以,我要问的是,是否有一种有效的方法可以在 CouchDB 中对 View 结果进行分页,从而可以从任意页面获取所有项目? (我正在使用 couchdb-python ,但希望没有任何依赖于客户端的东西。)

最佳答案

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

One drawback of the linked list style pagination is that... jumping to a specific page doesn’t really work... If you really do need jump to page over the full range of documents... you can still maintain an integer value index as the view index and have a hybrid approach at solving pagination.
   — http://books.couchdb.org/relax/receipts/pagination

如果我没看错,您的情况将是:

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

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

对于第 2 步,您将编写一个带有 map 函数的 View ,类似于这样(在 Javascript 中):

function(doc):
emit(doc.page_seq, doc)

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

results = db.view("name_of_view")
page_size = ... # say, 20
page_no = ... # 1 = page 1, 2 = page 2, etc.
begin = ((page_no - 1) * page_size) + 1
end = begin + page_size
my_page = results[begin:end]

然后您可以遍历 my_page。

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

欢迎提出意见/改进。

关于python - CouchDB 中的无状态分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com