【问题标题】:Stateless pagination in CouchDB?CouchDB 中的无状态分页?
【发布时间】:2011-03-06 03:13:05
【问题描述】:

我在使用 CouchDB 进行分页时看到的大多数研究表明,您需要做的是从您的视图中获取前十个(或多个)项目,然后记录最后一个文档的 docid 并将其传递给下一个页。不幸的是,我发现该方法存在一些明显的问题。

  • 这显然使得在一组页面内跳转是不可能的(如果有人直接跳转到第 100 页,您必须运行第 2-99 页的查询,以便知道如何加载第 100 页)。李>
  • 它要求您在页面之间传递可能的大量状态信息。
  • 很难正确编码。

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

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

【问题讨论】:

    标签: python pagination couchdb


    【解决方案1】:

    我是 CouchDB 的新手,但我想我可以提供帮助。我从 CouchDB: The Definitive Guide 中阅读了以下内容:

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

    如果我没看错,你的方法是:

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

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

    对于第 2 步,您将编写一个带有类似这样的地图函数的视图(在 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 假定您没有为视图过滤数据集,如果您试图让它与任意查询一起使用,您很快就会遇到麻烦。

    欢迎评论/改进。

    【讨论】:

      【解决方案2】:

      我们通过使用 CouchDB Lucene 搜索列表解决了这个问题。 0.6 Snapshot 足够稳定,你应该试试:

      CouchDB Lucene repository

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 2021-08-01
        • 2014-08-24
        • 2014-03-03
        • 1970-01-01
        • 2016-07-07
        • 2017-02-16
        • 2015-10-25
        • 2011-02-08
        相关资源
        最近更新 更多