Pie*_*ier 23 javascript firebase firebase-realtime-database
考虑这个数据结构:
{
"users":{
"user-1":{
"groups":{
"group-key-1":true,
"group-key-3":true
}
}
},
"groups":{
"group-key-1":{
"name":"My group 1"
},
"group-key-2":{
"name":"My group 2"
},
"group-key-3":{
"name":"My group 3"
},
"group-key-4":{
"name":"My group 4"
},
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式获取特定用户的组:
firebase.database().ref('users/user-1/groups').on(...)
Run Code Online (Sandbox Code Playgroud)
哪个会给我这个对象:
{
"group-key-1":true,
"group-key-3":true
}
Run Code Online (Sandbox Code Playgroud)
所以现在我想检索这些组的信息.
我最初的直觉是循环这些键并执行此操作:
var data = snapshot.val()
var keys = Object.keys(data)
for (var i = 0; i < keys.length; i++) {
firebase.database().ref('groups/' + keys[i]).on(...)
}
Run Code Online (Sandbox Code Playgroud)
这是在Firebase中调用同一端点上的多个密钥的适当方法吗?
Firebase是否提供了解决此问题的更好方法?
Dev*_*lli 18
这是在Firebase中调用同一端点上的多个密钥的适当方法吗?
是的,通常这是一个很好的解决方案,以这种方式检索每个组.
Firebase是否提供了解决此问题的更好方法?
我不认为Firebase提供任何其他功能/查询,在这种情况下可以提供帮助.
无论如何,这可以改进将ref保存在变量中并直接循环对象的键.此外,如果您只需要检索一次这些数据,则应使用once()而不是on()
var groupRef = firebase.database().ref('groups/')
var data = snapshot.val()
for (var groupID in data) {
groupRef.child(data[groupID]).once(...)
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是将Firebase的功能用于数据快照,例如forEach
snapshot.forEach(function(childSnapshot) {
groupRef.child(childSnapshot.key).once(...)
})
Run Code Online (Sandbox Code Playgroud)
是的,你走的是正确的.正如在这个问题中写的那样,firebase将管理您的请求,您不必担心性能和往返时间.一旦迭代开始,您将收到firebase数据.所以请记住在你的ui中正确处理它.
另一个选项,取决于您的/groups数据增长的大小,是保留$firebaseObject整个/groups分支的快照(如果您使用的是angularfire),每当数据发生变化时都会刷新.然后你只需要跟踪这个快照.但同样,如果您打算与大量团队一起玩,那么您当前的解决方案是更好的选择.
另外,我建议您为要on检索的每个组设置事件.请记住,只要数据发生变化(取决于设置的事件),就会触发回调.根据您的使用情况,您应该考虑使用,.once("value"因为它只会触发一次数据,使其更可靠,更具性能,并且在您不期望它们时将避免处理回调.