【问题标题】:Firebase Database - Retrieve Multiple Entries [duplicate]Firebase 数据库 - 检索多个条目 [重复]
【发布时间】:2016-11-16 07:27:37
【问题描述】:

我的数据是非规范化的,并使用了 firebase 团队建议的反向索引。类似于:

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      }
    },
    ...
  }
}

现在我想加载 Ada 的所有组。我可以轻松获得她所属的组 ID 列表,因为它是她的用户对象的一部分。

有没有办法让我一次通过 ID 查询 Ada 的所有特定组?还是我需要为每个组 ID 创建一个 ValueEventListener 并分别请求每个组?

在安全方面 - 假设每个组只能由其成员读取,因此我无法查询所有组并在事后对它们进行排序。

【问题讨论】:

  • 大多数应用程序通过索引中的键并单独加载每个组。这并不是一个很大的性能消耗,因为 Firebase 会通过管道处理数据库请求。见stackoverflow.com/questions/35931526/…
  • @FrankvanPuffelen 你的意思是如果我遍历列表并为每个列表设置一个ValueEventListener,数据库将优化它自己检索数据的方式?还是我必须以某种方式请求数据?
  • 所有请求都通过同一个连接。 get(1)get(2)get(3)getAll([1,2,3]) 之间的唯一区别是帧的一些开销。
  • @ItaiHanski 也在为同样的问题苦苦挣扎——你找到更好的解决方案了吗?我发现的所有答案都像是“黑客”。
  • @eth0 不是真的。我基本上为每个组创建一个侦听器,然后等到他们都返回一个逻辑上被“加载”的答案

标签: android firebase firebase-realtime-database


【解决方案1】:

我猜你可以这样做:

var ref = new Firebase("<..>/groups");
ref.orderByChild("members/alovelace").equalTo(true)
  .once('value').then(function(dataSnapshot) {
     // handle read data
})

(未经测试,但根据this现在支持深度查询)

【讨论】:

  • 在 Android 中使用这个:Query query = mFirebaseDatabaseReference.child("groups").orderByChild("members/" + user.getId()).equalTo(true); .这是对所有数据的一次查询!
  • 这种方法有两个缺点 IMO:首先,从安全角度来看 - 这意味着每个用户都可以阅读整个 groups 树,其次,如果我有大量组,这可能会有点慢和浪费。我已经知道我感兴趣的组的确切 ID - 不使用它似乎很遗憾。
  • @ItaiHanski 你找到解决办法了吗?
  • @MuhammadUmar 没什么特别的。遍历所有获取并确保它们都返回。
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2015-08-19
  • 2018-04-16
相关资源
最近更新 更多