8

Lets say a comments table has the following structure:

id | author | timestamp | body

I want to use index for efficiently execute the following query:

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

Is there other efficient method I can use?

It looks that currently index is not supported for a filtered result of a table. When creating an index for timestamp and adding it as a hint in orderBy('timestamp', {index: timestamp}) I'm getting the following error:

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

4

4 回答 4

14

这可以通过“作者”和“时间戳”字段上的复合索引来完成。您可以像这样创建这样的索引:

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(因为所有键都具有相同的作者。)这里的关键是每次表访问只能使用一个索引,因此我们需要将所有这些信息塞进同一个索引。

于 2013-11-03T02:45:17.903 回答
4

目前不可能将 agetAllorderBy使用索引链接两次。现在只能在表上使用索引进行排序。

注意:带有索引的 orderBy 的命令是orderBy({index: 'timestamp'})(无需重复键)

于 2013-11-03T01:29:09.320 回答
2

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

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

二、betweenreturn a selection

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
于 2015-08-13T07:00:42.487 回答
1

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

//创建复合索引
r.table('评论')
.indexCreate(
  'author__timestamp', [r.row("author"), r.row("timestamp")]
)

//查询
r.table('评论')
。之间(
  ['我',r.minval],
  ['我',r.maxval],
  {索引:'作者__时间戳'}
)
.orderBy({index: r.desc('author__timestamp')}) //or "r.asc"
.skip(0) //页面
.limit(10) //国家!

我喜欢对复合索引使用两个下划线。这只是风格。选择如何命名复合索引并不重要。

参考:如何在 RethinkDB 中使用 getall 和 orderby

于 2016-09-13T17:02:17.030 回答