CouchDB 2.0中的Mango查询是否需要startkey分页

时间:2017-01-11 10:06:51

标签: pagination couchdb couchdb-mango couchdb-2.0

我一直都在搜索这个。我正在运行CouchDB 2.0并且理解我可以选择在检索一组数据时使用传统视图或更新的Mango查询。

所以我目前正在使用Mango查询语法并获得我需要的结果 - 但是我现在需要实现分页。在CouchDB 2.0中研究分页时,我发现围绕这个主题进行了很好的讨论:

http://docs.couchdb.org/en/2.0.0/couchapp/views/pagination.html

它表明分页大数据集的最佳方法是使用skip,而是使用startkey并从一个页面到下一个页面执行一种链接列表分页。

所以这对我来说很有意义并且适用于我的应用程序,但是当我转向Mango / _find API时,我看不到任何方式传递startkey:

http://docs.couchdb.org/en/2.0.0/api/database/find.html

令人困惑的是,它确实接受了跳过参数,但没有启动键。

有人能解释这里发生了什么吗? Mango / _find的性能特征是否大不相同,以便我们可以安全地使用跳过大型数据集?或者我们应该在遍历更大的数据集时使用带有startkey的视图吗?

这个特殊问题似乎没有在最近的AFAIK文档中得到解答。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以通过在选择器中包含约束来解决缺少endkey / "selector": { "_id": { "$gte": "myStartKey", "$lte": "myEndKey"} } 支持的问题:

/api/endpoint

(只是我的两分钱;也许其他人有更完整的答案)

答案 1 :(得分:0)

CouchDB记录的分页方法仅适用于map-reduce / views类型的查询,不能应用于Mango查询。主要是因为对于视图,有一个用于排序的关键字段,因此使用 startkey ' startkey '很容易跳过以前的文档。如果是非唯一键,则添加 startkey_docid

对于选择器查询,要有效地跳过以前的记录,您必须查看原始查询中指定的 sort 键,并添加另一个条件以跳过已处理的文档。例如,如果您在数字字段上排序(在asc中)并处理到值= 10,那么您可以添加{"字段" :{" $ gte" :10}}作为原始选择器中的$和逻辑。如果您有多个排序字段,这会变得复杂。跳过/限制可能是选择器查询分页的更简单方法。