我正在开发一个社交媒体网络应用程序,我想添加分享帖子功能。 当用户添加帖子时,我会将此帖子添加到 Firebase Firestore 的"帖子"集合中,当其他用户分享该帖子时,我会在用户文档的子集合中添加帖子,但是当我更改帖子集合中帖子中的某些内容时, 用户子集合中的复制版本没有改变,所以我想将帖子的原始版本和共享版本链接在一起,所以当我更改一个时,另一个也会更改。
假设如下:
- 给定的帖子只会在
/posts
集合中更改,而不会更改用户子集合中的副本 - 只有用户的好友才能访问用户的共享帖子
- 共享帖子将复制到位置
/profile/someUserId/sharedPosts
共享 - 帖子在共享时使用相同的文档 ID(例如
/posts/somePostId5
将共享为/profile/someUserId/sharedPosts/somePostId5
)
由于用户的共享帖子的访问权限有限,因此您不应能够从前端更新复制的帖子。最好的选择是帖子的作者在/posts/somePostId
更新原始帖子,然后将此版本复制到所有副本中。
为了安全地执行此操作,您可以使用 Firebase Cloud Function,该功能使用 Cloud FirestoreonUpdate
触发器和集合组查询来查找所有副本,然后使用批量写入同时以原子方式更新所有副本。
更新/posts/somePostId
(onUpdate
触发器)时,请执行以下操作:
- 获取编辑后的帖子的 ID
- 在
sharedPosts
上执行集合组查询,其中文档的 ID 等于帖子的 ID(最好的方法是将postID
存储在文档中)。 - 如果有任何结果,请启动一个新的批处理写入对象,并准备好复制帖子的新数据。
- 对于每个结果,使用新的发布数据向该结果位置的批处理写入添加一个设置操作。
- 提交批处理写入以对数据库进行更改
注意:如果用户想要编辑不属于他们的帖子,则应根据旧帖子的数据(/posts/somePostId
)创建一个新帖子(/posts/someNewPostId
)。这将允许上述过程以相同的方式工作。或者,您可以有一个建议的编辑集合,例如包含来自非帖子作者的用户的贡献的/posts/somePostId/proposedEdits
。
阅读链接的文档部分并尝试编写代码。如果您遇到困难,然后使用新问题来编辑您的问题。