在维护排序顺序的同时按日期查询Couchdb



我是couchdb的新手,我看过文档和SO帖子,但出于某种原因,这个简单的查询仍然让我难以捉摸。

SELECT TOP 10 * FROM x WHERE DATE BETWEEN startdate AND enddate ORDER BY score

更新:无法完成。这是不幸的,因为得到了这种类型您必须收回的数据可能有数百万条记录(字段),然后进行筛选、排序或限制你自己去获得想要的结果。我现在要回到我的使用_changes捕获并在其他地方存储我在.上执行查询所需的数据的原始解决方案

这是我的更新视图(感谢多米尼克):

emit([d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score], doc.name);

我需要做的是:

  • 总是按分数降序排序
  • (可选)按日期范围筛选(例如,仅限"今日")
  • x限制

更新:多亏了多米尼克,我更亲密了,但仍然有问题

?startkey=[2017,1,13,{}]&endkey=[2017,1,10]&descending=true&limit=10&include_docs=true

这会带回按分数排序的日期之间的文档

然而,如果我想在不考虑日期的情况下排名前十,那么我只会按日期(而不是分数)返回前十

对于初学者来说,在CouchDB中使用复杂键时,只能从左到右排序。这是一个常见的误解,但请阅读视图整理以获得更深入的解释。(当你在做的时候,阅读整个视图指南,因为你刚开始)

如果你想按分数排序,但只按日期筛选,你可以通过分解时间戳来实现这一点,只显示你关心的程度。

function (doc) {
var d = new Date(doc.date)
emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score ])
}

您最终会输出一个比当前更复杂的密钥,但您会这样查询:

startkey=[2017,1,1]&endkey=[2017,1,1,{}]

这将挑选出2017年1月1日的所有文件,并且已经按分数排序了!(按升序,只需交换startkeyendkey即可获得降序,无需更改视图)

顺便说一句,避免将整个doc作为视图中的值进行发射。利用include_docs=true参数并将emit的值留空可能更有效。(请参阅此SO问题了解更多信息)

使用这种精确的设置,您需要单独的视图才能按不同的精度进行查询。例如,要按月查询,只需使用年/月,依此类推

但是,如果你愿意/能够在申请中对分数进行排序,你可以使用一个视图来获得你想要的所有日期精度。例如:

function (doc) {
var d = new Date(doc.date)
emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHour(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() ])
}

使用此视图和group_level参数,您可以按年、月、日期、小时等获取所有分数。正如我所提到的,在这种情况下,它还不会按分数排序,但这可能会为您打开其他查询。(例如:本月有哪些用户参与?)

最新更新