Firebase - 实现可撤销 .update() 的正确方法?

Firebase - right way to implement an undoable .update()?

我刚开始学习 Firebase 并注意到任何操作都只是替换数据,这与我在 couchDB 上看到的有点不同。

根据我对他们文档的理解,为了使 .update() 操作的 rollback/undo 成为可能,我会使用 .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() 方法来删​​除此类操作的最后一项,我现在不得不以某种方式弄清楚哪个是第一个,哪个是最后一个。

肯定有一些优雅而直接的方法可以使回滚成为可能,不是吗?我错过了什么?

谢谢。

如果目标是单级撤消,那非常简单。

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

如果 priorValue 节点存在,则允许撤消,并将其值移动到 currentValue,然后删除先前的值。

您可以通过利用 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         

(概念上)最近的 priorValue 在索引 0 处,所以读取它,'pop' 它离开堆栈并将该值写入 currentValue 和 'move' 另一个值。

Firebase 中的数组中实际上没有 'move' 值的函数,因此只需通过代码读取数组,删除第 0 个元素并将数组写回。

总的来说,我不是 Firebase 中数组的超级粉丝,所以还有其他更可扩展的选项,但数组可能适合这个特定的用例。