假设 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上执行。在:
答案 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)
目前无法使用索引两次将getAll
与orderBy
链接起来。
使用索引进行排序只能在表格上进行。
注意:带索引的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!
我喜欢使用两个下划线来表示复合索引。这只是风格。无论你如何选择命名复合索引。