L'API Firebase permette solo di filtrare i bambini di un livello di profondità (o with a known path) con i suoi orderByChild
e equalTo
metodi.
Quindi senza modificare/espandere la struttura di dati correnti che lascia solo la possibilità di recuperare tutti i dati e filtrare lato client:
var ref = firebase.database().ref('Users');
ref.once('value', function(snapshot) {
snapshot.forEach(function(userSnapshot) {
var blogs = userSnapshot.val().blogs;
var daBlog = blogs['efg'];
});
});
Questo è, naturalmente, altamente inefficiente e non scalerà quando hai un numero non banale di utenti/blog.
Quindi la soluzione comune a che è quello di un cosiddetto indice per il vostro albero che mappa la chiave che si sta cercando per il percorso in cui risiede:
{Blogs:
"abc": "1234567",
"zyx": "1234567",
"efg": "7654321",
"hij": "7654321"
}
Quindi è possibile accedere rapidamente il blog utilizzando:
var ref = firebase.database().ref();
ref.child('Blogs/efg').once('value', function(snapshot) {
var user = snapshot.val();
ref.child('Blogs/'+user+'/blogs').on('value, function(blogSnapshot) {
var daBlog = blogSnapshot.val();
});
});
si potrebbe anche voler riconsiderare se si può ristrutturare i propri dati per adattarsi meglio il vostro caso d'uso e le limitazioni di Firebase. Hanno una buona documentazione sulla strutturazione dei dati, ma la più importante per le persone nuove a NoSQL/database gerarchici sembra essere "avoid building nests".
fonte
2014-11-29 23:53:58
Vedere anche http://stackoverflow.com/questions/24869180/query-hierarchical-data-structure-in-firebase – Kato
Non c'è davvero alcun motivo per cui i blog facciano parte dei record degli utenti. Non sono un "attributo" logico di un utente, sono un'entità separata con le proprie strutture di dati, scopo e scenari di lettura/scrittura. Comincerei dividendo quelli (come diceva Frank) e rendendo le cose semplici e dirette. – Kato