3

我一直在寻找这个。我正在运行 CouchDB 2.0,并且了解在检索一组数据时,我可以在使用传统视图或更新的 Mango 查询之间做出选择。

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

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

它表明对大型数据集进行分页的最佳方法不是使用跳过,而是使用 startkey 并执行一种从一页到下一页的链表分页。

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

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

令人困惑的是,它确实接受了一个跳过参数,但没有 startkey。

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

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

4

2 回答 2

0

您也许可以通过在选择器中包含约束来解决缺少startkey/支持的问题:endkey

"selector": {
    "_id": { "$gte": "myStartKey", "$lte": "myEndKey"}
}

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

于 2017-01-30T21:32:45.763 回答
0

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

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

于 2017-03-09T11:39:40.503 回答