2016-07-31 21 views
1

Ich habe die folgende Datenstruktur in RethinkDB Tabelle gespeichert:tritt in rethinkdb

{ 
    id: string, 
    parentId: string, 
    timestamp: number, 
    data: Object 
} 

Diese Datenstruktur einen Baum bildet, kann es die folgende Abbildung (weiß Aufzeichnungen gewöhnliche Daten repräsentieren tragen Aufzeichnungen dargestellt werden unter Verwendung der roten diejenigen, haben ihre data Eigenschaft gleich null die Operation darstellt löschen):

Diagram

für jeden Datensatz nun in der Tabelle zu berechnen, ich möchte in der Lage sein, die nextRecord. Welches ist der nächste Rekord in der Zeit zu dem aktuellen. Die Aufgabe scheint einfach, wenn nur ein Datensatz ist darauf zurück zu einem Elternteil:

1 => 2 
4 => 9 
5 => 6 
6 => 8 
... 

Aber es wird immer schwieriger, einen solchen Wert zu berechnen, wenn übergeordneten Datensatz wird von mehreren untergeordneten Datensätze verwiesen wird:

2 => 3 
3 => 5 
7 => 11 

Dies ist auch der Fall, wenn keine untergeordnete Referenz vorhanden ist. In diesem Fall sollte das Ergebnis null lauten (zum Beispiel enthält Datensatz Nr. 8 keine untergeordneten Datensätze und daher sollte null zurückgegeben werden).

Also frage ich nicht, die Abfrage selbst zu schreiben (was auf der anderen Seite wäre wirklich toll für mich), aber zeigen Sie zumindest die Richtung, in der ich eine Lösung für dieses Problem finden kann.

Vielen Dank im Voraus!

Antwort

1

Sie können dies effizient mit einem zusammengesetzten Index auf parentId und timestamp tun. Sie können den Index wie folgt erstellen:

r.table('data').indexCreate('parent_timestamp', function(row) { 
    return [row('parentId'), row('timestamp')]; 
}) 

Nachdem Sie das getan haben, können Sie den frühesten Punkt mit Elternteil Eltern wie so finden:

r.table('data') 
.between([PARENT, r.minval], [PARENT, r.maxval], {index: 'parent_timestamp'}) 
.orderBy({index: 'parent_timestamp'}) 
.nth(0).default(null)