2016-07-04 25 views
21

Considerando questa struttura dati:Come recuperare più chiavi in ​​Firebase?

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

ho potuto ottenere i gruppi di un particolare utente con:

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

Il che mi avrebbe dato questo oggetto:

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

Quindi ora voglio per recuperare le informazioni per quei gruppi.

Il mio istinto sarebbe quello di loop di quelle chiavi e fare questo:

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

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

E 'questo il modo appropriato per chiamare chiavi multiple sullo stesso endpoint in Firebase?

Firebase fornisce un modo migliore per risolvere questo problema?

+0

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

risposta

15

È questo il modo appropriato per chiamare più chiavi sullo stesso endpoint in Firebase?

Sì, generalmente questa è una buona soluzione per recuperare ogni gruppo in questo modo.

Firebase fornisce un modo migliore per risolvere questo problema?

Non credo che Firebase fornisca altre funzioni/query che potrebbero aiutare in questo caso.

In ogni caso, questo potrebbe essere migliorato salvando il riferimento in una variabile e eseguendo il ciclo direttamente sui tasti dell'oggetto. Inoltre, se hai solo bisogno di recuperare i dati una volta, è necessario utilizzare once() invece di on()

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

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

Un altro modo potrebbe essere utilizzando Firebase del functions per le istantanee di dati, come forEach

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

bel pensiero a tutti! :) – adolfosrs

+0

Grazie a @adolfosrs! La tua risposta sugli ascoltatori in pipeline è un buon punto :) –

4

Sì, è stanno andando nella giusta direzione. Come scritto in this question firebase condurrà le tue richieste e non dovrai preoccuparti delle prestazioni e del tempo di andata e ritorno. Non appena inizia la tua iterazione, riceverai i dati di Firebase. Quindi tieni a mente per gestirlo correttamente nel tuo ui.

Un'altra opzione, che la volontà dipende da quanto è grande dati /groups cresceranno, è quello di mantenere uno snapshot (potrebbe essere un $firebaseObject se si utilizza angularfire) dell'intero /groups ramo che si aggiorna ogni volta che le modifiche dei dati. Quindi devi solo tenere traccia di questa istantanea. Ma di nuovo, se hai intenzione di giocare con una grande quantità di gruppi, la tua soluzione attuale è una scelta migliore.

Inoltre, si consiglia di avere cura di impostare un evento on per ciascun gruppo che si recupera. Tieni presente che la richiamata verrà attivata ogni volta che i dati cambiano (dipende dall'evento impostato). A seconda del caso d'uso, dovresti considerare l'utilizzo di .once("value" poiché attiverà i dati solo una volta, rendendolo più affidabile, più performante ed eviterà di gestire i callback quando non li aspetti.