2016-04-21 9 views
0

Ich versuche, eine Rethinkdb-Datenbank mit einem Audit-Trail in node.js zu erstellen.Rethinkdb Audit Trail mit Feld Zeitstempel und Status beim Update/Einfügen

Meine Tabelle enthält die folgenden Felder:

Bestell-ID Menge Preis Status Zeitmarke

Ich habe eine Datei, die ich die folgenden Daten als Beispiel laden:

Bestell-ID ...... Menge ..... Preis

1 .................... '1000' ........ ..100

2 .................... '500' ............ 100

3 ..... ............... '1575' .......... 100

Wenn ich in eine leere Tabelle lade, werden alle diese Zeilen zusammen mit der Zeit eingefügt & Datum und Status auf "aktiv" gesetzt.

Nehmen wir an, ich die Datei laden wieder mit aktualisierten Daten (die Menge der Auftragsnummer 1 wird geändert), zum Beispiel:

Bestell-ID ...... Menge ..... Preis

1 .................... '' .......... 100

2 ... ................. '500' ............ 100

3 ............ ........ '1575' .......... 100

Die Rethinkdb-Abfrage sollte den Status der Zeile mit der Auftrags-ID 1 auf "Ersetzt" setzen und den Zeitstempel aktualisieren. Als nächstes sollte eine neue Zeile mit den aktualisierten Daten eingefügt werden, der Status sollte auf "aktiv" gesetzt und mit einem Zeitstempel versehen werden.

Also meine Tabelle mit den neuen aktualisierten Daten soll wie folgt aussehen:

Bestell-ID ...... Menge ..... Preis ..... Status ...... ....... Zeitstempel

1 .................... '1000' .......... 100 .. .... 'ersetzt' ..... '12:03 AM 22.04.2016'

1 .................... '1010' .......... 100 ....... 'aktiv' ....... '' 12:03 AM 22.04.2016 '

2 ...... .............. "500" ............ 1 00 ...... 'aktiv' ......... '12:00 AM 22.04.2016'

3 ................ .... '1575' .......... 100 ...... 'aktiv' ......... '12:00 AM 22.04.2016'

Jetzt habe ich einen Audit-Trail, um zu sehen, was und wann es geändert/eingefügt wurde.

Ist dies mit rethinkdb in node.js möglich?

@dalanmiller

Ich habe versucht, die Codes zu testen, aber ich verstehe nicht, die prepend und die 0-te.

Eine der Annahmen, die Sie gemacht haben, ist, dass sich nur die Menge ändern kann. Was passiert, wenn sich der Preis ändern kann oder beide gleichzeitig? Es ist möglich, dass ich weitere Felder/Spalten hinzufügen möchte, die auch im Laufe der Zeit aktualisiert werden können.

Es ist auch möglich, dass die Bestellung einige Male wechselt.

Die Daten sind in der Variablen 'Nachricht'. Diese

ist das, was ich für jetzt und es nicht aktualisiert:

r.db('testing').table('orders').filter({Order_ID: message[ticks].Order_ID}).count().run() //count how many rows with this Order_ID 
     .then(function(feed){ 
     if (JSON.stringify(feed)==1){    //check if the order_id already exist 

     r.db('testing').table('orders').filter({Order_ID: message[ticks].Order_ID}).update(message[ticks]).do(
     function (post) { 
     return r.branch(post('replaced').eq(0), 
      false,  //if nothing changes, leave it as it is 
      r.db('testing').table('orders').post('orders').prepend(post('orders').nth(0).merge({message[ticks].Quantity})) // <-- I don't understand how this works 
     ) 
     }).run() 

    } 
    else if (JSON.stringify(feed)==0){ 
     //new order. Insert the order  
     message[ticks].Timestamp = new Date(); //add timestamp 
     message[ticks].Status = 'Active';   // add status as 'Active' 
     r.db('testing').table('orders').insert(message[ticks]).run() 
    } 
+0

Hey Big Skinny, überprüfen Sie meine Antwort und lassen Sie mich wissen, wenn das für Sie funktioniert, – dalanmiller

+0

Hallo, danke für Ihre Eingabe und Zeit. Ich werde es in den nächsten Tagen testen und zu dir zurückkommen. –

+0

@dalanmiller, könnten Sie bitte überprüfen, was ich falsch mache? –

Antwort

0

Dies ist auf jeden Fall möglich, mit Knoten und RethinkDB zu tun.

Eine Möglichkeit, dies zu tun, ist ein Array von Objekten innerhalb des Dokuments, das die Reihenfolge selbst darstellt. Für diese Anwendung gehen wir davon aus, dass das Objekt im 0. Index des Arrays order_state die neueste Version des Auftrags ist.

Vereinfachend einmal ein Auftrag wird es in etwa so aussehen könnte:

{ 
    order_id: 1, 
    order_state: [ { quantity: 20, price: 100, timestamp: "12:03AM 4/22/2016"} ] 
} 

Und dies kann durch die ReQL Abfrage erfolgen:

r.db("marketplace").table("orders").insert({ above_obj }) 

jetzt sagen, wenn die Person, die das gemacht Der Auftrag entscheidet, zurückzugehen und die Bestellung in 40 anstatt 20 zu ändern.

r.db("marketplace").table("orders").get(id of document).update((doc) => { 

    return { 
    orders: doc('orders').prepend(doc('orders').nth(0).merge({ quantity: 40})) 
    } 

}) 

Hier sind wir zum ersten Mal das Dokument mit dem Befehl .get() immer dann .update es ing. Wir geben dann ein Objekt mit dem Schlüssel { orders: } zurück, so dass das Feld orders im Original ersetzt wird. Wir nehmen den ursprünglichen Wert von orders und .prepend() das Array mit einer Kopie des vorherigen 0. Element, das wir mit .merge ändern, um die aktualisierte Menge von 40 zu haben.

{ 
    id: "a randomly generated uuid", 
    order_id: 1, 
    orders: [ 
     { 
     quantity: 40, price: 100, timestamp: "12:35AM 4/22/2016" // Newest modification 
     }, 
     { 
     quantity: 20, price: 100, timestamp: "12:03AM 4/22/2016" // Original order 
     } 
    ] 
} 

Ein Nachteil dabei ist, dass, wenn Sie Tausende von Änderungen an einem Auftrag erwarten, möchten Sie, dass in einem anderen Tisch setzen und dann einige tun Art zwischen den beiden kommen. Wenn die durchschnittlichen Auftragsänderungen relativ klein bleiben, sagen wir < 100, dann sollte dieses Schema für Sie in Ordnung sein.