Firebase 中是否有(或是否考虑过)类似'merge'或'batch'设置?



今天在用Firebase做更多的编程时,我发现自己希望有几个功能:

1) 合并集:

假设我有一个具有值{a:1,b:2,c:3}的火力基地ref

如果我做类似ref.set({a:-1,b:-2})的事情,新值将(不出所料){a:-1,b:-2}.

相反,想象一下ref.mergeSet({a:-1,b:-2})会导致 ref 的值被{a:-1,b:-2,c:3}

现在,我意识到我可以做一些类似ref.child("a").set(-1)ref.child("b").set(-2)的事情来实现这个结果,但至少在某些情况下,我宁愿只对我的.on()处理程序进行一次调用。

这就进入了我的第二个想法。

2)批量设置:

在我的应用程序中,我想要一种方法来强制任意数量的调用.set只导致对其他客户端.on的一次调用。像这样:

ref.startBatch()
ref.child("a").set(1)
ref.child("b").set(2)
....
ref.endBatch()

在批处理模式下,.set 不会导致对.on的调用,相反,对.on的最小调用次数都将由调用.endBatch 产生。


我欣然承认这些想法还很萌芽,如果它们与Firebase现有的架构特征相冲突,我不会感到惊讶,但我想无论如何我都会分享它们。我发现在使用 Firebase 时,我不得不花更多的时间来确保客户端之间的一致性,而不是我预期的。

再次感谢,并继续努力。

更新:我们在 Firebase 网络客户端中添加了新的 update() 方法,并在 REST API 中添加了 PATCH 支持,允许您在特定位置以原子方式修改多个同级,而其他同级不被修改。 这就是您描述的"合并集",可以按如下方式使用:

ref.update({a: -1, b: -2});

这将更新"a"和"b",但保留"c"不变。


旧答案

感谢您的详细功能请求! 我们很想听到更多关于您的用例以及这些原语将如何帮助您的信息。 如果你愿意分享更多详细信息,请发送电子邮件 support@firebase.com 我们可以深入了解你的方案。

不过,要回答您的问题,我们没有这些功能的主要原因与我们的架构和我们试图维护的性能/一致性保证有关。 不要太深入,但如果您想象您的 Firebase 数据分布在许多服务器上,那么在修改树中靠近的数据时,我们更容易获得更强的保证(原子性、排序等),而不是修改远处的数据。 因此,通过将这些保证限制为可以用单个 set() 调用替换的数据,我们将您推向一个在 Firebase 架构中表现良好的方向。

在某些情况下,您可以通过重组树来大致获得您想要的东西。 例如,如果你知道你总是想把"a"和"b"放在一起,你可以把它们放在一个共同的"ab"父级下,然后做ref.child('ab').set({a:-1, b:-2});,这不会影响"c"子级。

就像我说的,我们很想听到更多关于你的方案。 我们处于测试阶段,因此我们可以向开发人员了解他们如何使用 API 以及它的不足之处! support@firebase.com :-)

最新更新