今天在用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 :-)