如何在Firebase中检索多个密钥?

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)

  • 很好的想到了forEach!:) (3认同)

ado*_*srs 6

是的,你走的是正确的.正如在这个问题中写的那样,firebase将管理您的请求,您不必担心性能和往返时间.一旦迭代开始,您将收到firebase数据.所以请记住在你的ui中正确处理它.

另一个选项,取决于您的/groups数据增长的大小,是保留$firebaseObject整个/groups分支的快照(如果您使用的是angularfire),每当数据发生变化时都会刷新.然后你只需要跟踪这个快照.但同样,如果您打算与大量团队一起玩,那么您当前的解决方案是更好的选择.

另外,我建议您为要on检索的每个组设置事件.请记住,只要数据发生变化(取决于设置的事件),就会触发回调.根据您的使用情况,您应该考虑使用,.once("value"因为它只会触发一次数据,使其更可靠,更具性能,并且在您不期望它们时将避免处理回调.