2014-11-29 5 views
14

Data la struttura di dati di seguito in firebase, voglio eseguire una query per recuperare il blog 'efg'. Non conosco l'ID utente a questo punto.Firebase Query Double Nested

{Users : 
    "1234567": { 
      name: 'Bob', 
      blogs: { 
       'abc':{..}, 
       'zyx':{..} 
      } 
    }, 
    "7654321": { 
      name: 'Frank', 
      blogs: { 
       'efg':{..}, 
       'hij':{..} 
      } 
    } 
} 
+0

Vedere anche http://stackoverflow.com/questions/24869180/query-hierarchical-data-structure-in-firebase – Kato

+2

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

risposta

19

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".

+0

impressionante grazie – denisjacquemin

+14

Nota che [query profonde] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html) sono ora una funzionalità. – Kato

+3

Ci ho pensato per qualche minuto, ma mi arrendo: come risolverebbe questo problema con una query approfondita? –