我是couchdb的新手,我查看了文档和SO帖子,但由于某种原因,这个简单的查询仍然无法解决。
SELECT TOP 10 * FROM x WHERE DATE BETWEEN startdate AND enddate ORDER BY score
更新:无法完成。这是不幸的,因为要获得这种类型 你需要撤回数据的数百万条记录(少数记录) 从沙发上然后做过滤,排序或限制 你自己得到了预期的结果。我现在回到我的身边 使用_changes来捕获和存储我需要执行该查询的数据的原始解决方案。
以下是我的更新视图(感谢Dominic):
emit([d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score], doc.name);
我需要做的是:
更新:感谢Dominic我更接近 - 但仍然有一个 问题。
?startkey=[2017,1,13,{}]&endkey=[2017,1,10]&descending=true&limit=10&include_docs=true
这会在按分数排序的日期之间收回文件
然而,如果我想要前10名,不管日期如何,那么我只会按照日期排序前10名(而不是得分)
答案 0 :(得分:3)
首先,在CouchDB中使用复杂键时,您可以仅从左到右排序。这是一种常见的误解,但请阅读Views Collation以获得更深入的解释。 (当你在这里时,也要阅读整个Guide to Views,因为你已经开始了)
如果您希望能够按分数排序,但只能按 date 进行过滤,则可以通过分解时间戳来仅显示您关注的程度来实现此目的。
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,{}]
这将在1-1-2017挑选出所有文件,它将按分数排序! (按升序排列,只需交换startkey
和endkey
即可获得降序,不需要更改所需的视图)
另外,请避免将整个doc
作为视图中的值发出。利用include_docs=true
参数并将您的emit值保持为空可能更有效。 (有关更多信息,请参阅this SO question)
通过这种精确设置,您需要单独的视图才能按不同的精度进行查询。例如,要按月查询,您只需使用年/月等等。
但是,如果您愿意/能够在应用程序中对分数进行排序,则可以使用单个视图来获得所需的所有日期精度。例如:
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
参数,您可以按年,月,日,小时等获得所有分数。正如我所提到的,在这种情况下,它不会按分数排序,但是也许这会给你打开其他疑问。 (例如:本月用户参与了什么?)