如何在Firebase中链接不同集合中的两个文档以一起更新它们?



我正在开发一个社交媒体网络应用程序,我想添加分享帖子功能。 当用户添加帖子时,我会将此帖子添加到 Firebase Firestore 的"帖子"集合中,当其他用户分享该帖子时,我会在用户文档的子集合中添加帖子,但是当我更改帖子集合中帖子中的某些内容时, 用户子集合中的复制版本没有改变,所以我想将帖子的原始版本和共享版本链接在一起,所以当我更改一个时,另一个也会更改。

假设如下:

  • 给定的帖子只会在/posts集合中更改,而不会更改用户子集合中的副本
  • 只有用户的好友才能访问用户的共享帖子
  • 共享帖子将复制到位置/profile/someUserId/sharedPosts
  • 共享
  • 帖子在共享时使用相同的文档 ID(例如/posts/somePostId5将共享为/profile/someUserId/sharedPosts/somePostId5)

由于用户的共享帖子的访问权限有限,因此您不应能够从前端更新复制的帖子。最好的选择是帖子的作者在/posts/somePostId更新原始帖子,然后将此版本复制到所有副本中。

为了安全地执行此操作,您可以使用 Firebase Cloud Function,该功能使用 Cloud FirestoreonUpdate触发器和集合组查询来查找所有副本,然后使用批量写入同时以原子方式更新所有副本。

更新/posts/somePostId(onUpdate触发器)时,请执行以下操作:

  1. 获取编辑后的帖子的 ID
  2. sharedPosts上执行集合组查询,其中文档的 ID 等于帖子的 ID(最好的方法是将postID存储在文档中)。
  3. 如果有任何结果,请启动一个新的批处理写入对象,并准备好复制帖子的新数据。
  4. 对于每个结果,使用新的发布数据向该结果位置的批处理写入添加一个设置操作。
  5. 提交批处理写入以对数据库进行更改

注意:如果用户想要编辑不属于他们的帖子,则应根据旧帖子的数据(/posts/somePostId)创建一个新帖子(/posts/someNewPostId)。这将允许上述过程以相同的方式工作。或者,您可以有一个建议的编辑集合,例如包含来自非帖子作者的用户的贡献的/posts/somePostId/proposedEdits

阅读链接的文档部分并尝试编写代码。如果您遇到困难,然后使用新问题来编辑您的问题。

最新更新