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

时间:2016-07-04 21:59:46

标签: 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"
        },
    }
}

我可以通过以下方式获取特定用户的群组:

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是否提供了解决此问题的更好方法?

2 个答案:

答案 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",因为它只会触发一次数据,使其更可靠,性能更高,并且避免在您不期望它们时处理回调。