【问题标题】:CouchDB pagination sorted by date, queried by idCouchDB 分页按日期排序,按 id 查询
【发布时间】:2011-03-08 21:50:53
【问题描述】:

我想使用 CouchDB 视图 API 在应用程序级别创建分页。分页使用游标,所以给定一个游标,我将在视图中查询以给定游标作为开始键的n+1 文档,并将n 结果作为页面输出,并提供n+1 结果行作为游标下一页。

只要视图键也是我的视图行的键,这很有效。现在这一次我所有的文档都有一个日期字段,我将它们作为映射键发出,因为我想按日期排序。但是,我不能再像以前那样使用我的光标了。

我认为这就是视图 API 还提供 startkey_docid 来提交此类游标文档 ID 的原因,但这显然不是真的。似乎只有在每个键有几个相等的行时才应用此值。

所以,简而言之:我想要一个按日期排序的视图,但光标基于文档 ID。我该怎么做?

提前致谢

Simplified view

function map(doc)
{
    emit(doc.date, {_id: doc._id});
}


Simplified view result:

{
"rows":[
    {"id":"123","key":"2010-06-26T01:28:13.555Z", value:{...}},
    {"id":"234","key":"2010-06-22T12:21:23.123Z", value:{...}},
    {"id":"987","key":"2010-06-16T13:48:43.321Z", value:{...}},
    {"id":"103","key":"2010-05-01T17:38:31.123Z", value:{...}},
    {"id":"645","key":"2009-07-21T21:21:13.345Z", value:{...}}
]
}

Application-level query with cursor 234, page size 3 should return:
    234, 987, 103

那么如何将其映射到视图?

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    为什么要基于 docid 的游标?

    Map Reduce 创建一维索引,因此任何非键遍历都会很昂贵。但是,我认为你可以做你想做的事,而不需要同时遍历 2 个索引。

    例如在这里查看我如何通过带有特定标签的帖子进行分页:

    Sofa's CouchApp tag pagination

    又名

    http://jchris.couchone.com/sofa/_design/sofa/_list/index/tags?descending=true&reduce=false&limit=10&startkey=[%22life%22%2C{}]&endkey=[%22life%22]

    该视图中的键看起来像 ["tag","2008/10/25 04:49:10 +0000"],因此您可以按标签和在标签内按时间进行分页。

    已编辑

    哈!我刚刚意识到你想要做什么。非常简单。

    忘记所有关于 docid 的事情,它们无论如何都应该是随机的,并且与任何东西都没有关系,所以只需忘记 docs 甚至有一秒钟的 id。

    您说“使用游标 234、页面大小 3 的应用程序级查询应返回: 234、987、103"

    您的光标不应该是 234。它应该是键“2010-06-22T12:21:23.123Z”。

    所以本质上你使用最后一行结果的键作为下一个查询的开始键。因此,例如 startkey=""2010-06-22T12:21:23.123Z""&limit=3,然后对于您呈现的每个页面,链接到一个查询,其中新的 startkey 是最后一个返回的键。

    奖励:根据我刚才的描述,您将第 2 页的底行变为第 3 页的顶行。要解决此问题,请将 skip=1 添加到您的查询中。

    额外奖励:好的,当我有超过 3 个文档发送到视图中的同一个键时怎么办?那么最后一个键将始终与第一个键相同,因此您无法在不扩展限制参数的情况下进行分页。除非...您使用 startkey_docid (并将其设置为最后一行的 id)。那是你应该使用 startkey_docid 的唯一一次。

    【讨论】:

    • 嗯,您的标签用例略有不同。而是拿博客上的例子。想想一个有日期的博客条目。您知道按日期对条目进行分页,而无需使用由于性能原因而应避免的限制/跳过模式。
    • 哦,我想使用游标而不是页码的原因是因为它们是无状态的。这对于我的 REST 用例来说是必要的。
    • "只要视图键也是我的视图行的键,这种方法就可以很好地工作。"这是您在原始问题上失去我的部分。这可能是一个使事情变得比它必须的更复杂的情况。这里只是简单的按日期分页:jchris.couchone.com/sofa/_design/sofa/_list/index/…
    • 啊,明白了。无论如何,你不能在 CouchDB 中做页码(除了跳过...),你必须做链表样式的分页。结合 _changes 提要,应该可以创建一个版本,它不仅是无状态的,而且在创建时实时显示应该在当前页面上的新项目。
    • 好的,我想要的是一个按条目日期排序的链接列表作为视图,但视图段应该由它们的 doc._ids 分隔。但我有一种不祥的预感,那是不可能的。最初我是这么认为的,因为 startkey_docid 和 endkey_docid 参数。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2021-08-13
    • 1970-01-01
    • 2012-12-13
    • 2014-06-04
    相关资源
    最近更新 更多