考虑这个数据结构:
{
"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"
},
}
}
我可以通过以下方式获取特定用户的群组:
firebase.database().ref('users/user-1/groups').on(...)
哪会给我这个对象:
{
"group-key-1":true,
"group-key-3":true
}
所以现在我想检索这些组的信息。
我最初的本能是循环这些键并执行此操作:
var data = snapshot.val()
var keys = Object.keys(data)
for (var i = 0; i < keys.length; i++) {
firebase.database().ref('groups/' + keys[i]).on(...)
}
这是在Firebase中调用同一端点上的多个密钥的合适方法吗?
Firebase是否提供了解决此问题的更好方法?
答案 0 :(得分: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(...)
}
另一种方法是使用Firebase的functions作为数据快照,例如forEach
snapshot.forEach(function(childSnapshot) {
groupRef.child(childSnapshot.key).once(...)
})
答案 1 :(得分:6)
是的,你正在以正确的方式前进。正如this question中所写,firebase将管理您的请求,您不必担心性能和往返时间。一旦迭代开始,您将收到firebase数据。所以请记住在你的ui中正确处理它。
另一个选项,取决于/groups
数据增长的大小,是保留快照(如果使用angularfire,可能是$firebaseObject
)整个/groups
数据更改时将刷新的分支。然后你只需要跟踪这个快照。但同样,如果您打算与大量团队一起玩,那么您当前的解决方案是更好的选择。
另外,我建议您为要检索的每个组设置on
事件。请记住,只要数据发生变化(取决于设置的事件),就会触发回调。根据您的使用情况,您应该考虑使用.once("value"
,因为它只会触发一次数据,使其更可靠,性能更高,并且避免在您不期望它们时处理回调。