我在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
});
但那失败了。
答案 0 :(得分:1)
就数据读取而言,最有效的方法可能是对数据进行非规范化。您可以将电子邮件地址存储在各个用户节点和emailAddresses
节点中。然后,您可以直接查询emailAddresses
节点以查找电子邮件列表。
仍有~1m的电子邮件地址节点可能会同时出现太多。我可能会把它拿出来......我猜。
“抓住大块”基本上是分页。在尝试推出自己的分页解决方案之前,我会尝试使用现成的东西。
要检查的分页库:
如果您想推出自己的分页,请查看:
答案 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.
});
这里的关键是每个子节点触发一次此事件,类似于迭代数组中的所有索引。
这将检索每个孩子并将其呈现给您的应用程序,一次一个孩子,迭代节点内的所有孩子。
需要花费一段时间才能通过这么多节点进行咀嚼。