【问题标题】:Is startkey pagination required for Mango queries in CouchDB 2.0CouchDB 2.0 中的 Mango 查询是否需要 startkey 分页
【发布时间】:2017-05-26 01:36:56
【问题描述】:

我一直在寻找这个。我正在运行 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 中的性能特征是否有很大不同,以便我们可以安全地在大型数据集上使用 skip?或者我们应该在遍历更大的数据集合时使用带有 startkey 的视图?

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

【问题讨论】:

    标签: pagination couchdb couchdb-mango couchdb-2.0


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多