当前位置: 首页 > 知识库问答 >
问题:

Firestore函数监听更新

金霄
2023-03-14

我是React native和firestore的初学者,使用它们来构建一种社交媒体应用程序,我有一个奇怪的问题(我认为我构建数据库的方式不对)。我想有一个feed,所有的帖子,没有追随者,没有任何东西。我第一次在db中构建帖子时是这样的:用户(集合)-

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

第二种方法工作得很好。在feed中,我只获取帖子。但是当我尝试打开帖子时,问题就出现了(需要有这个功能)。我需要能够在反应导航标头上显示用户的姓名,但我只有帖子的详细信息,只有userId,这没有什么用。

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

TLDR:在firestore需要一个功能,以听取来自其他集合或重组数据库的更新。

共有1个答案

虞高雅
2023-03-14

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

如果您要从多个用户获取帖子,则可以在运算符中使用

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})
        })
    });
 类似资料:
  • 本文向大家介绍Angular2中监听数据更新的方法,包括了Angular2中监听数据更新的方法的使用技巧和注意事项,需要的朋友参考一下 angular2 模型数据更新了,需要监听数据改变, 一、实现接口Docheck,检测页面上所有元素数据更新 二、针对页面上某个元素的数据更新做处理 1、定义模板驱动表单名 2、ts 文件中新建一个表单元素对象。 3、ngonInit中订阅数据更新 以上这篇Ang

  • Object.defineProperty() 简单用法: /* Object.defineProperty(obj, prop, descriptor) */ var o = { a: 0 } Object.defineProperty(o, 'b', { get: function () { console.log('get') return

  • 问题内容: 我的任务是在每次日期更改时(每12am)触发一种刷新或重置我的应用程序的方法。我试图在网上搜索答案,但找不到任何东西。我可以使用Android中的任何方法/或侦听器吗?或任何方法?有什么建议吗? 问题答案: 是的,您可以在Android上收听日期/时间更改。为此,请在您的Activity中显式注册以下意图过滤器的BroadcastReceiver: 此意图每分钟发送一次。您 不能通过

  • 在JavaScript中是否可以监听属性值的更改?例如: 我想响应属性中的任何更改。 我已经阅读了对象,以及该对象的替代对象(包括使用动画事件的对象)。据我所知,它们是关于实际DOM的更改。我更感兴趣的是对一个特定DOM元素的属性更改,所以我不认为仅此而已。当然,在我的实验中,这似乎不起作用。 我希望在没有jQuery的情况下这样做。 谢谢

  • 问题内容: 我刚刚在Windows上安装了node.js。我有一个不运行的简单代码: 我得到:错误:听EADDRINUSE 是否有一个 配置文件 告诉node.js在特定端口上侦听? 问题是我已经让Apache监听了端口80。 编辑: 问题答案: 没有配置文件,除非您自己创建一个。但是,端口是函数的参数。例如,侦听端口8124: 如果查找打开的端口时遇到问题,可以转到命令行并输入: 查看每个适配器

  • 我做了一个程序,动态地从一个面板获取数据,但是我的代码需要用户点击输入按钮来更新数据。有没有一个更改监听器或其他监听器可以在任何时候更新Jtext field中的数据?谢谢!