2015-02-18 4 views
9

Ich möchte Datensätze mit ID = 1 zwischen zwei Zeitstempeln auflisten und sie schließlich nach Timestamp ordnen.Wie getall mit orderby in RethinkDB zu verwenden

Mysql Abfrage etwas:

Select * from test 
where (timestamp between 100099323 AND 1423699323) AND id=1 
order by timestamp 

gibt es mehr als 5.000.000 Dokumente in umdenken Datenbank.

Ich habe versucht, Index für die einfache mysql Abfrage mit:

Select * from test where id=1 order by timestamp 

und Rethinkdb Abfrage ist:

r.table('test').getAll(1, {index: 'id'}).orderBy({index: 'timestamp'}) 

aber ich bin immer Fehler:

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"}) 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Jeder Vorschlag?

Antwort

11

RethinkDB unterstützt keine effiziente Indexüberschneidung (das Github-Problem zum Hinzufügen ist #809), aber Sie können diese Abfrage effizient implementieren, indem Sie einen zusammengesetzten Index für die Indizes 'id' und 'timestamp' hinzufügen.

Wenn Ihr Ergebnismenge klein genug ist, obwohl, könnten die orderBy nur optarg durch Fallenlassen der ‚Index‘ vollständig im Speicher erfolgen:

r.table("test").getAll(1, {index: "id"}).orderBy("timestamp") 

dies für große Ergebnismengen effizient zu tun, würden Sie brauche einen Index. Angenommen, Ihre ‚id‘ und ‚Zeitstempel‘ Indizes entsprechen direkt Felder in Reihen, aussehen würde den Index Zugabe wie:

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

Um alle Zeilen mit id=1 zu bekommen und sortieren nach dem Zeitstempel, würden Sie dann ausführen:

r.table("test").between([1], [2], {"index": "id_time"}) 
       .orderBy({"index": "id_time"}) 

Zusätzlich zu der ursprünglichen Abfrage zurück Sie auf dem laufenden, können Sie zwischen zwei Zeitstempel für id=1 abfragen, indem ausgeführt wird:

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