filter + orderby的RethinkDB索引

时间:2013-11-02 21:41:49

标签: rethinkdb

假设 comments 表具有以下结构:

id | author | timestamp | body

我想使用index有效地执行以下查询:

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

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

看起来表的过滤结果不支持当前索引。为timestamp创建索引并将其作为提示添加到orderBy('timestamp', {index: timestamp})时,我收到以下错误:

  

RqlRuntimeError:索引order_by只能在TABLE上执行。在:

4 个答案:

答案 0 :(得分:14)

这可以通过“author”和“timestamp”字段上的复合索引来实现。您可以像这样创建这样的索引:

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,因为它只获取具有作者“me”和任何时间戳的文档。然后我们对按时间戳排序的相同索引执行order_by(因为所有键都有相同的作者。)这里的关键是每个表访问只能使用一个索引,所以我们需要将所有这些信息填入相同的指数。

答案 1 :(得分:4)

目前无法使用索引两次将getAllorderBy链接起来。 使用索引进行排序只能在表格上进行。

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

答案 2 :(得分: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

答案 3 :(得分: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