2016-02-17 27 views
4

我想知道如何在Firebase中相应地更新我的数据。Firebase:原子交易和多位置更新

我的应用是一个社交网络。假设我必须更新user对象和post中的查看计数,当访问者进来时,我还必须更新同一对象中的updatedAt值。

  • viewsupdatedAt领域都有在postuser儿童特定.write授权,因此任何人都可以对其进行修改,不像其他孩子。
  • views儿童必须使用transaction递增计数原子
  • updatedAt孩子,另一方面,可以以任何方式更新,transactionsetupdate进行更新。

我想通过将这些更新放在一起来限制对Firebase的调用次数,并使整个更新原子化。 (也正因为有更多的,我不描述这里)

的问题是:

  1. 一个transaction同时更新viewsupdatedAt必须出现两次:在postsusers对象,但一个访客不能写在这些不属于他的物体上,只有两个viewsupdatedAt的孩子可以修改。 (即使其他人未触及)。
  2. 多位置事务在当前的Firebase API AFAIK中不可用,因此这也不是原子。
  3. 在多用户环境中,每个孩子的多位置更新会打破view孩子的原子性,这是一个问题。

最后,就是我目前在做:

一对views孩子transaction,并在updatedAt那些单一update,在两个postsusers对象,这使他们作业查看查看访客。很多!

这也不是原子的,除了views孩子,这对时间戳字段不是什么大问题,但在其他用例中仍然存在问题。

我的问题是:

任何建议为更好地执行?

+0

”文档说更新会破坏在该对象上发生的所有事务,它是全局的吗?不。这是您更新路径上的所有交易。 –

+0

对不起,我不明白,全球I ment:不仅是当前的用户会话,但应用程序的任何用户(我明白事务需要在更新的'路径'被取消)。我想这是答案显然是*是*。 – Pandaiolo

+0

我的错误[Firebase文档](https://www.firebase.com/docs/web/api/firebase/transaction.html)明确表示,虽然交易在同一地点被本地'set'取消,它是*不*被其他客户端的'set'取消。如果其他客户端访问相同的位置,本地客户端将重新尝试使用最新数据的事务。 – Pandaiolo

回答

0

至少,您应该能够使用data fan-out method拨打一个update()来更新用户和帖子上的updatedAt字段。

您可能拥有的任何增量计数器仍然需要单独的事务才能正确处理。 “