【问题标题】:Update all documents in a subcollection of another subcollection?更新另一个子集合的子集合中的所有文档?
【发布时间】:2021-08-16 23:07:33
【问题描述】:

我正在编写让用户更新他们的头像(又名 photoURL)的客户端逻辑。我需要做的是更新名为 comments 的子集合中的每个文档,该子集合存在于该用户的名为 posts 的集合下,并更新 photoURL 属性。

这是我需要访问的用户 cmets 子集合的示例路径:

/users/XrMD3azk4Jess5KNTSICv4RYEj02/posts/what-architecture-style-is-this_r3nosJHQIt/comments

我将如何遍历每个帖子文档并更新每个评论文档?

作为 FireStore 的新手,我如何引用集合的子集合,然后循环遍历它并更新每个评论文档?

如果有人可以帮我一把,我可以开始走上正确的道路,我将不胜感激。谢谢。

    const commentsCol = this.$fire.firestore
      .collection('users')
      .doc(`${this.userProfile.uid}`)
      .collection('posts')
      // I need to loop through here and get all the post docs, right?
      // ... then get the comments collection
      .collection('comments')
    const querySnapshot = await commentsCol.get()
    querySnapshot.forEach((comment) => update the photoURL property here..)

【问题讨论】:

  • 这应该是一个相当简单的三步过程:1)来自子集合的read all documents,2)循环结果,3)update each document。你有没有尝试过?
  • 所以我有 const postsCol = this.$fire.firestore .collection('users') .doc(${this.userProfile.uid}) .collection('posts') 但不知道如何访问 cmets 子集合
  • 应该是.collection("comments")。但是,如果您已经尝试过某些事情,那么编辑您的问题以包括在内会大大增加有人可以提供帮助的机会。
  • @FrankvanPuffelen 好的,弗兰克,我在这里挣扎……只是一个简单的问题,但我可能想多了?请参阅上面的更新代码...我放弃了。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

我现在看到您的 cmets 处于第三级,这使得这比平时更棘手。

您有两个主要选择:

  1. 您可以使用collection group query 来获取整个数据库中的所有comments(因此适用于所有用户)。这可能不是您想要做的。
  2. 您可以为一个用户的每个帖子加载 cmets,方法是首先加载该用户的所有帖子,循环遍历这些帖子,然后为每个帖子加载所有 cmets。

使用第二种方法,您浪费了用户阅读帖子的时间,但它可能比您在第一种方法中最终加载的其他用户的额外 cmets 要好得多。

这里的理想情况是,如果您可以使用单个查询从特定用户的所有帖子中加载所有 cmets,但不幸的是 Firestore API 目前不允许这样做。

【讨论】:

  • 谢谢,弗兰克!由于目前这只是基于概念,所以将 cmets 放在根集合而不是子集合中会更好吗?然后我可以在 cmets 集合中查询用户的 uid,然后在那里更新 photoURL。
  • 这里(或在大多数 NoSQL 数据建模中)没有单数的“更好”,这完全取决于您的用例。但是,如果您正在考虑这一点,您还可以在当前位置为每个评论添加相同的字段,并可能使用带有条件的集合组查询来为用户选择帖子上的 cmets。
  • 嘿@redshift 这里还需要什么吗?
  • 对不起,让我尽快回复您。
猜你喜欢
  • 2020-08-25
  • 2021-10-30
  • 1970-01-01
  • 2023-01-27
  • 2018-04-03
  • 2021-09-17
  • 2018-12-31
相关资源
最近更新 更多