2016-03-19 5 views
0

私はFirebaseを学んでいるだけで、どの操作でもデータが置き換えられることに気付きました。これはcouchDBで見たものとは少し異なります。Firebase - 元に戻すことができる.update()を実装する正しい方法?

.update()操作のロールバック/元に戻すことを可能にする目的で、私はそのドキュメントを理解して、.push()メソッドを使用します。 2つのバージョンのデータを保存して、前のオブジェクトを照会できるようにすることです。私は2つ以上のアイテムを格納していないので、起動するには、FILOのようなアプローチが必要です。 FIRST WRITE BEFORE

DATABASE:最初の書き込みref.child(someObject).update({keyOne:valueOneUpdated}) AFTER

myData 
+ someObject 
    - keyOne : valueOne 
    - keyTwo : valueTwo 

データベース:Iアイテムの前のバージョンを失ったため

myData 
+ someObject 
    - keyOne : valueOneUpdated 
    - keyTwo : valueTwo 

以上が、所望の結果ではありません。 FIRST WRITE ref.child(keyOne).push({keyOne:valueOneUpdated}) AFTER

DATABASE:

myData 
+ someObject 
    + keyOne 
    + 1k34jh23kj4h : valueOneUpdated 
    + 237we8sjkdf8 : valueOne 
    - keyTwo : valueTwo 

ウエッ! このような操作の最後の項目を取り除く方法がないので、どの項目が最初で、最後の項目が何であるか把握しなければなりません。

ロールバックを可能にするためには、エレガントで直接的な方法が必要ですか?私は何が欠けていますか?

ありがとうございました。

+0

Firebaseは、データに組み込みのバージョン管理メカニズムを提供していません。データベースにバージョン管理システムを構築するには、多くの方法があります。どちらがあなたに最適なのかは、主にアプリケーションのニーズに左右されます。 –

答えて

2

単なるレベルの元に戻すことを目標にしているのは、かなり簡単です。

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValue: valueOne 
    keyTwo 
     currentValue: valueTwo 

priorValueノードが存在する場合は、取り消しを許可して、その値をcurrentValueに移動し、以前の値を削除します。

あなたは(概念的には)最新のPRIORVALUEはインデックス0でそれが「ポップ」、スタックをそれを読み取りおよび書き込みであるFirebase

myData 
    someObject 
    keyOne 
     currentValue: valueOneUpdated 
     priorValues: 
      0: prior_value_3 //the value just prior to valueOneUpdated 
      1: prior_value_2 
      2: prior_value_1   

で配列を活用することで、複数のアンドゥを追加することでこれを拡張できその値をcurrentValueに移動し、もう一方の値を「移動」させます。

実際にFirebaseの配列内の値を移動する機能はありません。そのため、viaコードで配列を読み込み、0番目の要素を削除して配列を書き戻します。

私はArray's in Firebaseのファンではありませんので、他の拡張可能なオプションがありますが、配列はこの特定のユースケースに合うかもしれません。

+0

ありがとうございます。言及された「他のアプローチ」について詳述するためのケア?私はあまりにも印象firebaseを得ることは本当にあなたが配列を格納する必要はありません。 – tim

+1

@tim配列は問題ありませんが、多くの場合、より良いオプションがあるので、その使用は状況に応じています。この場合、配列はkey:valueのペアの自動索引セットを提供するため、必要性に合っている可能性があります。もう一つの選択肢は、私の答えで述べたのと同じ構造を使用し、配列の代わりにpriorValuesノード内でautoIdをキーとしてアンドゥ値を値としてノードを生成します。最新のものをキーで照会して、使用されているものを削除することができます。やり直しオプションも必要です。そのため、元に戻す/やり直しの手順をそのノードの子値として保存することもできます。 – Jay

+0

yea元に戻す/やり直す私はあなたがリドゥをしている場合、単にインデックスを変更しています。ですから、 'keyOne:{0:valueOne、1:valueOneUpdated}'を使うだけです – tim

関連する問題