如何在RethinkDB中使用getall和orderby

ami*_*mit 9 rethinkdb

我想列出两个时间戳之间id = 1的记录,最后根据时间戳排序.

Mysql查询的东西:

Select * from test 
where (timestamp between 100099323 AND 1423699323) AND id=1 
order by timestamp
Run Code Online (Sandbox Code Playgroud)

重新思考数据库中有超过500万个文档.

我尝试使用索引进行简单的mysql查询:

Select * from test where id=1 order by timestamp
Run Code Online (Sandbox Code Playgroud)

和Rethinkdb查询是:

r.table('test').getAll(1, {index: 'id'}).orderBy({index: 'timestamp'})
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

RqlRuntimeError: Indexed order_by can only be performed on a TABLE or 
TABLE_SLICE in:
r.table("test").getAll(1, {index: "id"}).orderBy({index: "timestamp"})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

小智 13

RethinkDB不支持有效的索引交集(添加Github问题是#809),但您可以通过为'id'和'timestamp'索引添加复合索引来有效地实现此查询.

但是,如果结果集足够小,orderBy可以通过删除'index'optarg完全在内存中完成:

r.table("test").getAll(1, {index: "id"}).orderBy("timestamp")
Run Code Online (Sandbox Code Playgroud)

要为大型结果集有效地执行此操作,您需要一个索引.假设您的'id'和'timestamp'索引直接对应于行中的字段,添加索引将如下所示:

r.table("test").indexCreate("id_time",
                            function(row) {
                                return [row("id"), row("timestamp")];
                            })
Run Code Online (Sandbox Code Playgroud)

要获取所有行id=1并按时间戳排序,您将运行:

r.table("test").between([1], [2], {"index": "id_time"})
               .orderBy({"index": "id_time"})
Run Code Online (Sandbox Code Playgroud)

此外,回到您发布的原始查询,您可以id=1通过运行在两个时间戳之间进行查询:

r.table("test").between([1, <time 1>], [1, <time 2>], {"index": "id_time"})
               .orderBy({"index": "id_time"})
Run Code Online (Sandbox Code Playgroud)