2016-07-04 28 views
21

In Anbetracht dieser Datenstruktur:Wie Sie mehrere Schlüssel in Firebase abrufen?

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

Welche mir dieses Objekt würde:

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

So, jetzt will ich

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

ich die Gruppen eines bestimmten Benutzers mit bekommen könnte um die Informationen für diese Gruppen abzurufen.

Mein erster Instinkt Schleife dies die Schlüssel und tun würde:

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

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

Ist dies der richtige Weg in Firebase mehrere Tasten auf dem gleichen Endpunkt zu nennen?

Bietet Firebase eine bessere Möglichkeit, dieses Problem zu lösen?

+0

Siehe http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

Antwort

15

Ist dies die geeignete Methode zum Aufrufen mehrerer Schlüssel auf demselben Endpunkt in Firebase?

Ja, im Allgemeinen ist dies eine gute Lösung, um jede Gruppe auf diese Weise abzurufen.

Bietet Firebase eine bessere Möglichkeit, dieses Problem zu lösen?

Ich glaube nicht, Firebase bietet eine andere Funktion/Abfrage, die in diesem Fall helfen könnte.

Wie auch immer, könnte dies verbessert werden, speichern Sie die Ref in einer Variablen und Schleifen auf den Tasten des Objekts direkt. Auch wenn Sie nur einmal diese Daten abrufen müssen, sollten Sie once() statt on()

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

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

Eine weitere Möglichkeit, Firebase der Verwendung könnte verwenden functions für die Daten-Snapshots, wie forEach

snapshot.forEach(function(childSnapshot) { 
     groupRef.child(childSnapshot.key).once(...) 
}) 
+3

schöner Gedanke über das forEach! :) – adolfosrs

+0

Danke @ adolfosrs! Ihre Antwort über Pipelined Listeners ist ein schöner Punkt zu :) –

4

Ja, Sie gehen in die richtige Richtung. Wie in this question geschrieben, wird firebase Ihre Anfragen weiterleiten und Sie müssen sich keine Gedanken über die Leistung und die Umlaufzeit machen. Sobald Ihre Iteration beginnt, erhalten Sie Firebase-Daten. Also denken Sie daran, es in Ihrem ui richtig zu handhaben.

Eine weitere Möglichkeit, das wird hängt davon ab, wie groß Ihre /groups Daten wachsen werden, ist eine Momentaufnahme zu halten (könnte ein $firebaseObject sein, wenn Sie angularfire verwenden) des gesamten /groups Zweig, der immer dann, wenn Datenänderungen neu geladen. Dann müssen Sie nur diesen Schnappschuss verfolgen. Aber auch wenn Sie vorhaben, mit einer großen Anzahl von Gruppen zu spielen, ist Ihre aktuelle Lösung eine bessere Wahl.

Außerdem empfehle ich Ihnen, ein Ereignis on für jede Gruppe, die Sie abrufen, festzulegen. Beachten Sie, dass der Callback immer dann ausgelöst wird, wenn sich die Daten ändern (abhängig vom eingestellten Ereignis). Abhängig von Ihrem Anwendungsfall sollten Sie die Verwendung von .once("value" in Betracht ziehen, da die Daten nur einmal ausgelöst werden, wodurch sie zuverlässiger und performatischer werden und Callbacks vermieden werden, wenn Sie sie nicht erwarten.

Verwandte Themen