2016-03-19 47 views
0

我剛剛學習Firebase,並注意到任何操作都會簡單地替換數據,這與我在couchDB上看到的有所不同。Firebase - 實現可撤消的.update()的正確方法?

在我對其文檔的理解中,爲了使.update()操作成爲可能的回滾/撤銷,我將使用.push()方法。這個想法是保留2個版本的數據,以便我可以查詢以前的對象。要啓動,需要使用FILO方法,因此我不能存儲超過2個項目。

數據庫之前,先寫:

myData 
+ someObject 
    - keyOne : valueOne 
    - keyTwo : valueTwo 

數據庫後第一次寫入ref.child(someObject).update({keyOne:valueOneUpdated})

myData 
+ someObject 
    - keyOne : valueOneUpdated 
    - keyTwo : valueTwo 

上面沒有期望的結果,因爲我失去了該項目的早期版本。

數據庫後第一次寫入ref.child(keyOne).push({keyOne:valueOneUpdated})

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

呸! 由於沒有pop()方法去除這樣的操作的最後一項,我現在面臨不得不以某種方式確定哪個是第一個,哪個是最後一個項目。

當然,必須有一些優雅和直接的方式使回滾成爲可能,不是嗎?我錯過了什麼?

謝謝。

+0

Firebase不提供數據的內置版本控制機制。在數據庫上構建版本控制系統有很多種方法。哪一個最適合你,主要取決於你的應用程序的需求。 –

回答

2

如果目標是具有單一級別的撤消操作,則非常簡單。

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

如果priorValue節點存在,則允許撤消,並將其值移至currentValue,然後刪除先前的值。

你可以通過利用陣列,火力地堡

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

(概念)最近priorValue爲指數0,讀它,「流行」它關閉棧上擴大與添加多個索馬里發展事務處和寫該值到currentValue並「移動」另一個值。

實際上並沒有一個函數可以在Firebase中的數組中移動值,所以只需在via代碼中讀取數組,然後移除第0個元素並將數組寫回。

我不是Firebase中Array的巨大粉絲,所以還有其他更多的可擴展選項,但是一個數組可能適合這個特定的用例。

+0

謝謝你的回覆。仔細闡述上述「其他方法」?我也得到了一個印象,firebase並不真的希望你存儲數組。 – tim

+1

@tim陣列沒有問題,但它們的使用是情境化的,因爲通常有更好的選擇。在這種情況下,數組可能適合需要,因爲它提供了一組自動索引的鍵:值對。另一種選擇是使用與我的答案中提到的相同的結構,並且在priorValues節點內而不是數組中,生成以autoId作爲鍵和撤消值作爲值的節點。您可以按鍵查詢最新的一個,並在使用時將其刪除。您也可能想要重做選項,因此將撤消/重做步驟存儲爲該節點的子值也可以。 – Jay

+0

是撤銷/重做我的數字是簡單地改變索引,如果你正在做一個重做。所以我只使用'keyOne:{0:valueOne,1:valueOneUpdated}' – tim