2016-07-13 63 views
5

I miei dati vengono denormalizzati e utilizzano un indice inverso come suggerito dal team di Firebase. Qualcosa di simile a:Database Firebase: recupero di più voci

{ 
    "users": { 
    "alovelace": { 
     "name": "Ada Lovelace", 
     // Index Ada's groups in her profile 
     "groups": { 
     // the value here doesn't matter, just that the key exists 
     "techpioneers": true, 
     "womentechmakers": true 
     } 
    }, 
    ... 
    }, 
    "groups": { 
    "techpioneers": { 
     "name": "Historical Tech Pioneers", 
     "members": { 
     "alovelace": true, 
     "ghopper": true, 
     "eclarke": true 
     } 
    }, 
    ... 
    } 
} 

Ora voglio caricare tutti i gruppi di Ada. Posso facilmente ottenere un elenco degli ID di gruppo a cui appartiene dato che fa parte del suo oggetto utente.

Esiste un modo per interrogare tutti i gruppi specifici di Ada per ID contemporaneamente? O devo creare un numero ValueEventListener per ID di gruppo e richiedere ogni gruppo separatamente?

Per quanto riguarda la sicurezza, supponiamo che ogni gruppo sia leggibile solo dai suoi membri, quindi non posso interrogare tutti i gruppi e ordinarli dopo il fatto.

+0

La maggior parte delle applicazioni attraverso le chiavi dal indice e caricare ciascun gruppo. Non si tratta di un grande drenaggio delle prestazioni, poiché Firebase esegue la pipeline delle richieste del database. Vedi http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

+0

@FrankvanPuffelen Do vuoi dire che se faccio un ciclo attraverso l'elenco e imposto un 'ValueEventListener' per ognuno di essi, il DB ottimizzerà il modo in cui recupera i dati da solo? O devo richiedere i dati in un certo modo? –

+0

Tutte le richieste passano attraverso la stessa connessione. L'unica differenza tra 'get (1)', 'get (2)', 'get (3)' e 'getAll ([1,2,3])' è un overhead per i frame. –

risposta

1

Credo che si potrebbe fare qualcosa di simile:

var ref = new Firebase("<..>/groups"); 
ref.orderByChild("members/alovelace").equalTo(true) 
    .once('value').then(function(dataSnapshot) { 
    // handle read data 
}) 

(testato, ma secondo this profonda Le query sono ora supportati)

+0

in Android: Query query = mFirebaseDatabaseReference.child ("groups"). OrderByChild ("members /" + user.getId()) equalTo (true).; . questa è una query per tutti i dati! – itzhar

+0

Questo approccio ha 2 svantaggi IMO: Innanzitutto, dal punto di vista della sicurezza - questo significa che ogni utente può leggere l'intero albero 'groups', e in secondo luogo, se ho un numero enorme di gruppi questo probabilmente sarebbe un po 'lento e dispendioso. Conosco già gli ID esatti dei gruppi a cui sono interessato - sembra un peccato non usarlo. –