我是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中读到了有关索引交集的问题,但也许我想念一些东西,也许有办法完成这个简单的任务。
谢谢。
答案 0 :(得分:0)
RethinkDB抱怨的原因是:
getAll
会返回selection
。将filter
应用于selection
后,它会返回selection
。当orderBy
应用于selection
时,index
参数无法使用(只有在orderBy
应用于table
时才能使用)。
orderBy
可以应用于table
,sequence
或selection
。 仅应用于table
时,可以使用index
参数。这是有道理的,因为在表中添加和删除行时会更新索引。
在您的情况下,您对orderBy
filter
的结果应用selection
。为了对数据库需要的选择进行排序:
并且在这种情况下它不能使用索引。
改进查询的方法可能是首先对表进行排序,然后应用过滤器。在这种情况下,您将能够使用索引。