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