【问题标题】:Firebase JS: Database call to iterate over nested dataFirebase JS:用于迭代嵌套数据的数据库调用
【发布时间】:2019-12-29 13:37:34
【问题描述】:

我正在使用 Firebase 实时数据库。顶层有一个“用户”列表,每个用户都有一个books 列表。我正在尝试迭代以从所有用户那里获取 all 书籍,但我在使用 firebase db 调用时遇到了问题。我正在尝试通过以下方式做到这一点,但我相信我在这次通话中做错了什么以实现我所追求的目标。

firebase.database().ref('/').on('value', (snapshot) => {
    snapshot.forEach((child) => {
        console.log(child.child('books').val());
    });
})

【问题讨论】:

  • 我假设('books' 之后缺少的). 只是问题中的错字。如果确实如此,那么运行此代码时会出现什么问题?它记录什么?您希望它记录什么?
  • 嗨@FrankvanPuffelen,对不起,是的——只是将它转移到stackoverflow的一种类型。我从代码中获取null 登录控制台
  • 您没有考虑到users 节点。因此,您要么需要在回调中执行此操作,要么读取树中较低的一级:firebase.database().ref('users')...。我也会在下面写一个答案。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

现在您正在读取根节点,然后遍历其子节点。这意味着childusers 节点的键和值的快照,而不是其下的子节点的快照。您可以通过记录子节点的密钥轻松验证:

firebase.database().ref('/').on('value', (snapshot) => {
  snapshot.forEach((child) => {
    console.log(child.key);
  });
})

这将记录:

用户

由于users 节点没有books 属性,所以child.child('books').val()null


有两种可能的解决方案:

  1. 只读取users 节点下的数据,您可以这样做:

    firebase.database().ref('/users').on('value', (snapshot) => {
      snapshot.forEach((user) => {
        console.log(user.child('books').val());
      });
    })
    
  2. 在您的回调中处理 users 节点,例如:

    firebase.database().ref('/').on('value', (snapshot) => {
      snapshot.child('users').forEach((user) => {
        console.log(user.child('books').val());
      });
    })
    

在任何一种情况下,您都可能还想遍历书籍,因此需要一个/另一个嵌套循环。比如:

firebase.database().ref('/users').on('value', (snapshot) => {
  snapshot.forEach((user) => {
    snapshot.child('books').forEach((book) => {
      console.log(book.val());
      // or: console.log(book.child('author').val());
    });
  });
})

【讨论】:

  • 这太好了,谢谢弗兰克!我刚刚意识到,就像你提到的那样,我需要另一个嵌套循环来遍历这些书籍。您认为在性能方面是否有意义,有一个名为“all_books”的新表与“用户”并存,当用户添加一本书时,我有另一个调用将其添加到“all_books”表中,以便该表有一个所有书籍的副本?否则,我将不得不迭代该循环,我预计它可能会随着大量用户和书籍而变得庞大
  • 在处理来自 Firebase 的数据时,大部分时间将花在从服务器传输到客户端的数据量上。如果您想打印/处理所有这些,则当前结构在这个意义上与拥有一个长列表相同。如果您希望只为一个用户显示书籍,那么您当前的结构实际上已经被用户很好地划分了。但是,如果您想通过查询显示所有用户的一些图书列表,最好有一个图书列表和每个图书的 UID 属性。
  • 非常感谢,弗兰克——很好的解释! - 刚刚接受作为答案,但我没有足够的声誉(新用户)来投票。再次感谢
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2019-03-25
  • 2019-03-29
  • 1970-01-01
  • 2017-02-12
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多