我是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日的所有文件,并且已经按分数排序了!(按升序,只需交换startkey
和endkey
即可获得降序,无需更改视图)
顺便说一句,避免将整个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
参数,您可以按年、月、日期、小时等获取所有分数。正如我所提到的,在这种情况下,它还不会按分数排序,但这可能会为您打开其他查询。(例如:本月有哪些用户参与?)