CouchDB中无状态分页?

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

  • 它显然使得它不可能在一组页面内跳过(如果有人直接跳到第100页,你将不得不运行第2-99页的查询,这样你就会知道如何加载第100页)。
  • 它要求你在页面之间传递很多状态信息。
  • 正确编码很困难。
  • 不幸的是,我的研究表明,使用skip使数据集5000记录或更大的数据量显着减速,并且一旦达到非常大的数据(如果有10条记录到页面大约需要20秒,有大量生产的数据集)。 所以这不是一个真正的选择。

    所以,我问的是,是否有一种有效的方法来分页查看CouchDB中的结果,以便从任意页面获取所有项目? (我正在使用couchdb-python,但希望没有任何关于这将取决于客户端。)


    我是CouchDB的新手,但我想我可以帮忙。 我从CouchDB读取以下内容:权威指南:

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

    如果我正在阅读这个权利,你的案例将会是:

  • 将数字序列嵌入到文档集中。
  • 将该数字序列提取到数字视图索引。
  • 使用算术计算任意页面的正确开始/结束数字键。
  • 对于第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假定你没有为你的视图过滤数据集,并且如果你试图让它与任意查询一起工作,你很快就会遇到麻烦。

    欢迎评论/改进。


    我们通过将CouchDB Lucene用于搜索列表解决了这个问题。 0.6快照足够稳定,你应该尝试一下:

    CouchDB Lucene存储库

    链接地址: http://www.djcxy.com/p/46391.html

    上一篇: Stateless pagination in CouchDB?

    下一篇: How to protect application pools from session serialization exceptions?