Rethinkdb getAll,orderBy with index - Tags

时间:2016-11-30 14:30:00

标签: rethinkdb

我是rethinkdb的新手,我喜欢它,但当我尝试优化查询并使其适用于更大的数据集时,我发现了一些问题。 问题很简单。

我需要按时间戳(row.to),按标签(row.tags),按时间戳(row.from)排序然后切片进行分页来过滤我的“事件”表。

row.tags有一个多索引,效果很好!

row.from和row.to是Event的开始/结束时间。

慢速查询(在100k条目上测试)是这样的:

r.db("test").table("event")
.getAll(r.args(["148a6e03-b6c3-4092-afa0-3b6d1a4555cd","7008d4b0-d859-49f3-b9e0-2e121f000ddf"]), {"index": "tags"})
.filter(function(row) {return row("to").ge(r.epochTime(1480460400));})
.orderBy(r.asc("from"))
.slice(0,20)

我在'from'上创建了一个索引并试图做

.orderBy(r.asc("from"),{index:'from'})

但是我得到了

  

e:索引order_by只能在TABLE或TABLE_SLICE中执行:

我已经在Rethinkdb中读到了有关索引交集的问题,但也许我想念一些东西,也许有办法完成这个简单的任务。

谢谢。

1 个答案:

答案 0 :(得分:0)

RethinkDB抱怨的原因是: getAll会返回selection。将filter应用于selection后,它会返回selection。当orderBy应用于selection时,index参数无法使用(只有在orderBy应用于table时才能使用)。

orderBy可以应用于tablesequenceselection应用于table时,可以使用index参数。这是有道理的,因为在表中添加和删除行时会更新索引。

在您的情况下,您对orderBy filter的结果应用selection。为了对数据库需要的选择进行排序:

  1. 将所有元素读入内存(默认情况下最多为100,000个元素)
  2. 使用提供的函数或字段对其进行排序
  3. 并且在这种情况下它不能使用索引。

    改进查询的方法可能是首先对表进行排序,然后应用过滤器。在这种情况下,您将能够使用索引。