Firebase获取特定密钥的所有值

时间:2016-12-15 21:22:05

标签: javascript firebase firebase-realtime-database

我在Firebase上有一个users ,每个用户都有一个email道具。

结构如下:

Users - > User UID(看起来像n8haBbjgablobA2ranfuabu3aaaga2af) - > User Obj,其中包含email prop。

我希望获得所有用户的数组'电子邮件(~1m)。

我怎样才能最有效地做到这一点?

PS:

我试过了:

usersRef.startAt(0).endAt(20).once("value", function(snapshot) {
  console.log('FIRST 20');
  console.log(snapshot.val()); // null
});

但那失败了。

3 个答案:

答案 0 :(得分:1)

就数据读取而言,最有效的方法可能是对数据进行非规范化。您可以将电子邮件地址存储在各个用户节点和emailAddresses节点中。然后,您可以直接查询emailAddresses节点以查找电子邮件列表。

仍有~1m的电子邮件地址节点可能会同时出现太多。我可能会把它拿出来......我猜。

更新

“抓住大块”基本上是分页。在尝试推出自己的分页解决方案之前,我会尝试使用现成的东西。

要检查的分页库:

  • Firebase Utils Pagination:这是由Firebase开发的,但他们说这是实验性的,还没有为生产使用做好准备。但是,它可能仍然值得一试。
  • firebase-paginator:这是由社区成员开发的,看起来非常稳固。

如果您想推出自己的分页,请查看:

  • @ kato在this StackOverflow answer中的回答他对分配实时数据集的潜在问题提出了一个有趣的观点,但随后提供了一些很好的入门代码
  • Here's a good blog entry讨论我认为是我链接到上面的firebase-paginator库的代码

答案 1 :(得分:0)

他们的回答中的每个人都说这是一件容易的事情,却没有可行的解决方案。这就是我想出的:

usersRef.orderByChild('uid').limitToFirst(100).once('value', function (snapshot) {
  var users = snapshot.val()
  var uids = Object.keys(users);
  var lastUid = uids[uids.length - 1];

  // could be another property than uid, for example email, or username. Ps.: Consider that the last ID from the previous chunk will be duplicated.
  usersRef.orderByChild('uid').startAt(lastUid).limitToFirst(100).once('value', function (snapshot) {
    var users = snapshot.val()
    var uids = Object.keys(users);
    console.log(uids);
    var lastUid = uids[uids.length - 1];
    // re-run function until done
  })
})

答案 2 :(得分:0)

由于这是一次性交易,因此选择是简单地迭代父数据中的每个节点'捕获子数据的节点,剥离电子邮件地址并将其转储到文件中。

你想要的事件是

  

child_added:检索项目列表或侦听列表的添加内容   的项目。每个现有的孩子都会触发一次此事件   每次将新子项添加到指定路径时再次出现。该   侦听器传递包含新子数据的快照。

和迭代数据节点中所有子节点的代码是

var dataRef = firebase.database().ref('myRootRef/data');
datRef.on('child_added', function(data) {
  //data.val() will contain the child data, such as the email address
  //append it to a text file here (for example), save to disk etc.
});

这里的关键是每个子节点触发一次此事件,类似于迭代数组中的所有索引。

这将检索每个孩子并将其呈现给您的应用程序,一次一个孩子,迭代节点内的所有孩子。

需要花费一段时间才能通过这么多节点进行咀嚼。