2016-04-21 8 views
0

node.jsに監査証跡を持つRethinkdbデータベースを作成しようとしています。更新/挿入時のフィールドタイムスタンプとステータスを持つRethinkdb監査証跡

私のテーブルには、次のフィールドが含まれています

注文-ID数価格ステータスのタイムスタンプ

私は例として、以下のデータをアップロードするファイルを持っている:

オーダーIDを......数量.....価格

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

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

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

空のテーブルにアップロードすると、これらのすべての行が時間とともに挿入されます&の日付とステータスが「アクティブ」に設定されています。

のは、私は、例えば更新されたデータ(変更されたため、ID 1の量)、再びファイルをアップロードすると仮定しましょう:

注文-ID ......数量.....価格

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

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

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

Rethinkdbクエリは、order-ID 1の行のステータスを '置き換え'に設定し、タイムスタンプを更新する必要があります。次に、更新されたデータを含む新しい行を挿入し、ステータスを「アクティブ」に設定し、タイムスタンプする必要があります。

ので、新しい更新されたデータと私のテーブルには、次のようになります。

注文-ID ......数量.....価格.....状態を...... .......タイムスタンプ

1 .................... '1000' .......... 100 .. .... 'が置き換えられ..... .....' 12:03 AM 4/22/2016 '

1 ....................' 1010 ' .......... 100 ....... 'アクティブ' ........ '12:03 AM 4/22/2016'

2 ...... .............. '500' ............ 1 00 ...... ......「アクティブ」.........「12:00 AM 4/22/2016」

3 ................ .... '1575' .......... 100 ... 'アクティブ' ......... '12:00 AM 4/22/2016'

今ではいつ、いつ、どのように変更/挿入されたのかを見るための監査証跡があります。

これはnode.jsのrethinkdbで可能ですか?

@dalanmiller

私はコードをテストしようとしたが、私が先頭に追加し、0番目を理解していません。

あなたが作成した前提の1つは、量だけが変更できることです。価格が変わることがある場合や、一度に価格が変わる場合はどうなりますか?時間をかけて更新することができるフィールド/列をさらに追加したい場合があります。

注文は数回変更することもできます。

データは「メッセージ」と呼ばれる変数にあります。

これは私が今のところ持っており、それが更新されないものです:

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

こんにちはビッグスキニー、私の答えをチェックして、それがあなたのために働くかどうかお知らせください。 – dalanmiller

+0

こんにちは、あなたの入力と時間をありがとう。私は次の日にそれを試して、あなたに戻ってくるつもりです。 –

+0

@dalanmiller、私が間違っていることを確認できますか? –

答えて

0

これは、ノードとRethinkDBで行うこと間違いも可能です。

これを行う1つの方法は、ドキュメント内にオーダー自体を表すオブジェクトの配列を持たせることです。このアプリケーションでは、order_state配列の0番目のインデックスのオブジェクトが最新のオーダーのバージョンであると仮定します。単純化し

、順序がそれはこのような何かを見ることができる行われた後:

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

そして、これがReQLクエリによって行うことができます。

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

作った人ならば今言います注文は20ではなく40に戻り、注文を変更します。

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

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

}) 

ここではがそれをINGの.update、その後.get()コマンドで文書を取得して最初のものです。その後、元のordersフィールドが置き換えられるように、キー{ orders: }のオブジェクトを返します。元の値orders.prepend()を、配列で修正する前の0番目の要素のコピーで更新し、40とします。ここ

{ 
    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 
     } 
    ] 
} 

一つの欠点は、あなたが順番に変更の数千人を期待している場合、あなたは別のテーブルにそれを置くと、2つの間の結合のいくつかの並べ替えをしたいということです。平均注文の修正が比較的小さくても、たとえば<とすると、このスキーマはあなたにとってうまくいくはずです。

関連する問題