5

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

1)合并集:

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

如果我做类似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 时,我不得不花费更多时间来确保客户端之间的一致性,这超出了我的预期。

再次感谢,并继续出色的工作。

4

1 回答 1

8

更新:我们为 Firebase Web 客户端添加了一个新的update () 方法,并为REST API添加了 PATCH 支持,它允许您在特定位置以原子方式修改多个同级,而其他同级保持不变。这就是您所说的“mergeSet”,可以按如下方式使用:

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

这将更新“a”和“b”,但不修改“c”。


旧答案

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

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

在某些情况下,您可以通过重新组织树来大致获得所需的内容。例如,如果您知道您总是想将 'a' 和 'b' 设置在一起,则可以将它们放在一个共同的 'ab' 父级和 do 下ref.child('ab').set({a:-1, b:-2});,这不会影响 'c' 子级。

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

于 2012-06-19T00:35:20.373 回答