web-dev-qa-db-fra.com

Comment récupérer plusieurs clés dans Firebase?

Compte tenu de cette structure de données:

{
    "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"
        },
    }
}

Je pourrais obtenir les groupes d'un utilisateur particulier avec:

firebase.database().ref('users/user-1/groups').on(...)

Ce qui me donnerait cet objet:

{
    "group-key-1":true,
    "group-key-3":true
}

Alors maintenant, je veux récupérer les informations de ces groupes.

Mon instinct initial serait de boucler ces clés et de faire ceci:

var data = snapshot.val()
var keys = Object.keys(data)

for (var i = 0; i < keys.length; i++) {
    firebase.database().ref('groups/' + keys[i]).on(...)
}

Est-ce la façon appropriée d'appeler plusieurs clés sur le même point de terminaison dans Firebase?

Firebase fournit-il un meilleur moyen de résoudre ce problème?

22
Pier

Est-ce la façon appropriée d'appeler plusieurs clés sur le même point de terminaison dans Firebase?

Oui, c'est généralement une bonne solution pour récupérer chaque groupe de cette façon.

Firebase fournit-il un meilleur moyen de résoudre ce problème?

Je ne pense pas que Firebase fournisse une autre fonction/requête qui pourrait aider dans ce cas.

Quoi qu'il en soit, cela pourrait être amélioré en enregistrant la référence dans une variable et en bouclant directement sur les clés de l'objet. De plus, si vous avez juste besoin de récupérer ces données une fois, vous devez utiliser once() au lieu de on()

var groupRef =  firebase.database().ref('groups/')
var data = snapshot.val()

for (var groupID in data) {
    groupRef.child(data[groupID]).once(...)
}

Une autre façon pourrait être d'utiliser fonctions de Firebase pour les instantanés de données, comme forEach

snapshot.forEach(function(childSnapshot) {
      groupRef.child(childSnapshot.key).once(...)
})
18
Devid Farinelli

Oui, vous allez dans le bon sens. Comme indiqué dans cette question firebase va canaliser vos demandes et vous n'aurez pas à vous soucier des performances et du temps d'aller-retour. Dès que votre itération commencera, vous recevrez des données Firebase. Gardez donc à l'esprit de le gérer correctement dans votre interface utilisateur.

Une autre option, qui dépendra de la taille de votre /groups les données vont augmenter, c'est pour garder un instantané (pourrait être un $firebaseObject si vous utilisez angularfire) de l'ensemble /groups branche qui s'actualisera à chaque changement de données. Ensuite, il vous suffit de suivre cet instantané. Mais encore une fois, si vous prévoyez de jouer avec un grand nombre de groupes, votre solution actuelle est un meilleur choix.

De plus, je vous recommande de prendre soin de définir un événement on pour chaque groupe que vous récupérez. Gardez à l'esprit que le rappel sera déclenché chaque fois que les données changent (dépend de l'événement défini). Selon votre cas d'utilisation, vous devriez envisager d'utiliser .once("value" car il ne déclenchera les données qu'une seule fois, ce qui les rendra plus fiables, plus performantes et évitera de gérer les rappels lorsque vous ne vous y attendez pas.

6
adolfosrs