2013-11-02 68 views
7

比方说,一个评论表的结构如下:RethinkDB指数过滤器+排序依据

id | author | timestamp | body 

我想用索引高效地执行以下查询:

r.table('comments').getAll("me", {index: "author"}).orderBy('timestamp').run(conn, callback) 

有其他有效的方法我可以使用?

看起来,当前索引不支持过滤结果的表。当timestamp创建索引和orderBy('timestamp', {index: timestamp})将其添加为一个提示,我发现了以下错误:

RqlRuntimeError: Indexed order_by can only be performed on a TABLE. in:

回答

11

这可与“作者”和“时间戳”字段的化合物索引来实现。你可以像这样创建这样一个索引:

r.table("comments").index_create("author_timestamp", lambda x: [x["author"], x["timestamp"]]) 

然后你可以使用它像这样进行查询:作品之间

r.table("comments") 
.between(["me", r.minval], ["me", r.maxval] 
.order_by(index="author_timestamp) 

类似的get_all原始查询中的那样,因为它只是变得具有作者“我”和任何时间戳的文档。然后,我们在按时间戳排序的同一索引上执行order_by(因为所有的键都有相同的作者),因此这里的关键是每个表只能使用一个索引,因此我们需要将所有这些信息填入相同的指数。

+0

这不适合我。看起来你在这里使用Python语法....?! – williamle8300

+0

这工作,速度超快。谢谢 :) – codefreak

4

它目前还无法链与orderBy使用索引的getAll两次。 使用索引进行订购只能在桌面上完成。

NB:到ORDERBY的命令与索引是orderBy({index: 'timestamp'})(无需重复键)

2

Joe Doliner的答案被选中,但对我来说似乎是错误的。

首先,在between命令中没有指定索引器。因此between将使用主索引。

二,between返回一个选择

table.between(lowerKey, upperKey[, {index: 'id', leftBound: 'closed', rightBound: 'open'}]) → selection 

orderBy不能选择与指数运行,只表可以使用索引。

table.orderBy([key1...], {index: index_name}) → selection<stream> 
selection.orderBy(key1, [key2...]) → selection<array> 
sequence.orderBy(key1, [key2...]) → array 
1

您想创建所谓的“复合索引”。之后,您可以高效地查询它。

 
//create compound index 
r.table('comments') 
.indexCreate(
    'author__timestamp', [r.row("author"), r.row("timestamp")] 
) 

//the query 
r.table('comments') 
.between(
    ['me', r.minval], 
    ['me', r.maxval], 
    {index: 'author__timestamp'} 
) 
.orderBy({index: r.desc('author__timestamp')}) //or "r.asc" 
.skip(0)  //pagi 
.limit(10) //nation! 

我喜欢对复合索引使用两个下划线。这只是风格。无论您选择如何命名复合索引,都无关紧要。

参考:How to use getall with orderby in RethinkDB