按日期查询Couchdb,同时保持排序顺序

时间:2017-01-11 20:44:08

标签: couchdb

我是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);

我需要做的是:

  • 始终按分数降序排序
  • 可选择按日期范围过滤(例如,仅限今天)
  • 受x限制
  

更新:感谢Dominic我更接近 - 但仍然有一个   问题。

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

这会在按分数排序的日期之间收回文件

然而,如果我想要前10名,不管日期如何,那么我只会按照日期排序前10名(而不是得分)

1 个答案:

答案 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挑选出所有文件,它将按分数排序! (按升序排列,只需交换startkeyendkey即可获得降序,不需要更改所需的视图)

另外,请避免将整个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参数,您可以按年,月,日,小时等获得所有分数。正如我所提到的,在这种情况下,它不会按分数排序,但是也许这会给你打开其他疑问。 (例如:本月用户参与了什么?)