【问题标题】:Firestore function to listen for updates用于侦听更新的 Firestore 功能
【发布时间】:2021-09-25 22:51:39
【问题描述】:

我是 React native 和 firestore 的初学者,并使用它们来构建一种社交媒体应用程序,但我遇到了一个奇怪的问题(我认为我以错误的方式构建了 db)。我想要一个提要,包含所有帖子,没有基于关注的内容,没有任何内容。我第一次在数据库中构造我的帖子是这样的:users(collection)->user(doc)->thisUserPosts(collection inside doc) - 但我找不到从所有用户获取所有 thisUserPosts 的方法(doc ) 并正确显示它们。

所以我像这样重新构建了数据库: 2 主要收藏、帖子和用户。完全不同。在用户集合中,只有用户及其数据(姓名、年龄等)的文档。另一方面,他们的帖子(名称、媒体、desc 和 userId - 其中 userId == 创建它的人。帖子集合文档中的 userId 字段应该存在于用户集合中)。

第二种方法效果很好。在提要中,我只获取帖子。 但是当我尝试打开帖子时出现问题(需要有这个功能)。我需要能够在 react-navigation 标题上显示用户名,但我只有帖子的详细信息,只有 userId,这没什么用。

所以我想出了一个解决方案:在帖子集合文档中添加一个 userName 字段,在 userId 旁边并简单地显示它。现在有一个问题:我需要想办法(我认为在 firestore 中)收听来自用户集合文档的更新,以防用户更新他的姓名/用户名(我不想展示旧名称)。而且我不知道这是否可能在 Firestore 内或如何。还是找一个不同的数据库结构更好?

TLDR:需要 Firestore 中的函数来监听来自其他集合的更新或重组数据库。

【问题讨论】:

  • 如果你没有使用Cloud functions,那么你应该删除google-cloud-functions标签:)

标签: reactjs firebase react-native google-cloud-firestore


【解决方案1】:

如果您正在获取单个用户的帖子,那么您只需为他的文档设置一个侦听器。 确保该文档不包含不得与他人共享的敏感信息,并且仅限于所有者。

如果您要从多个用户那里获取帖子,那么您可以使用in 运算符:

db.collection("users").where("userID", "in", ["user_id1", "user_id2"])
    .onSnapshot((snapshot) => {
        console.log(snapshot.docs.map(user => user.data()))
    });

如果我假设您将在所有用户的帖子中更新新名称,那么您可以在帖子文档本身上设置侦听器,但如果获取的所有 30 个帖子都来自同一用户,那将不是很好。这最终将花费 30 次读取来更新相同的名称。

编辑: 一个阅读用户帖子并收听用户名更新的简单示例:

const userID = "my_user_id"

// fetching user's 30 posts
const postsRef = firebase.firebase().collection("posts").where("userID", "==", userID).limit(30)
const postsSnapshot = await postsRef.get()
const postsData = postsSnapshot.docs.map(post => post.data())
// Array of posts data objects

// listening to change in user's name
firebase.firestore().collection("users").doc("user_id")
    .onSnapshot((doc) => {
        console.log("data: ", doc.data());
        const newUsername = doc.data().username
        const updatedPostsData = postsData.map(post => {
          return ({...post, username: newUsername})
        })
    });

【讨论】:

  • 我正在获取所有帖子。所有帖子,来自一个名为“帖子”的集合中的所有用户。唯一区别它们的是我添加了一个字段用户标识,该用户标识在创建帖子时自动添加。用户身份。 == firebase.auth().currentUser.uid 。我只需要更新该集合中需要更新的那些帖子。
  • @flaneurx 因此,如果您要从单个用户那里获取帖子,那么只需在用户的文档上设置一个侦听器。只需读取 1 次即可获取每个客户的更新名称。然后只需遍历您获取的文档数组并更新其中的用户名。
  • 如果您不介意,能否请您详细说明一下?正如我所说,我对 Firestore 有点陌生
  • 还创建了数据库的可视化结构,我认为它会有所帮助:imgur.com/a/AHLEufA
  • @flaneurx 保持简单: 1. 获取用户的帖子。 2.在users集合中的用户文档上添加监听器。
猜你喜欢
  • 2021-08-07
  • 2018-04-06
  • 2021-07-07
  • 2020-01-07
  • 1970-01-01
  • 2019-12-13
  • 2020-01-24
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多