2014-11-29 11 views
14

Angesichts der Datenstruktur unten in Firebase, ich möchte eine Abfrage ausführen, um das Blog 'Efg' abrufen. Ich kenne die Benutzerkennung zu diesem Zeitpunkt nicht.Firebase Query Double Nested

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

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

+2

Es gibt wirklich keinen Grund, Blogs als Teil der Benutzerdatensätze zu haben. Sie sind kein logisches "Attribut" eines Benutzers, sie sind eine separate Entität mit eigenen Datenstrukturen, Zweck und Lese-/Schreibszenarien. Ich würde damit beginnen, diese zu spalten (wie Frank erwähnte) und die Dinge einfach und direkt zu machen. – Kato

Antwort

19

Die Firebase-API können Sie nur Kinder eine Ebene tiefer (oder with a known path) mit seinem orderByChild und equalTo Methoden filtern.

So ohne Änderung/Ihre aktuelle Datenstruktur erweitert, die nur die Möglichkeit lässt alle Daten abrufen und filtern es clientseitige:

var ref = firebase.database().ref('Users'); 
ref.once('value', function(snapshot) { 
    snapshot.forEach(function(userSnapshot) { 
     var blogs = userSnapshot.val().blogs; 
     var daBlog = blogs['efg']; 
    }); 
}); 

Das ist natürlich sehr ineffizient und nicht skaliert, wenn Sie haben eine nicht-triviale Anzahl von Benutzern/Blogs.

So ist die gemeinsame Lösung für das heißt zu einem sogenannten Index zu Ihrem Baum, der den Schlüssel zuordnet, die Sie auf den Weg suchen, in dem sie sich befindet: Zugriff Sie

{Blogs: 
    "abc": "1234567", 
    "zyx": "1234567", 
    "efg": "7654321", 
    "hij": "7654321" 
} 

Dann können schnell den Blog Verwendung:

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(); 
    }); 
}); 

Sie auch zu überdenken möchten, wenn Sie Ihre Daten neu strukturieren können, um besser Ihre Use-case und Firebase seiner Grenzen zu passen. Sie haben eine gute Dokumentation über die Strukturierung Ihrer Daten, aber die wichtigste für Leute, die neu in NoSQL/hierarchischen Datenbanken sind, scheint "avoid building nests" zu sein.

+0

genial danke Ihnen – denisjacquemin

+14

Beachten Sie, dass [tiefe Abfragen] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html) sind jetzt ein Feature. – Kato

+3

Ich habe für ein paar Minuten darüber nachgedacht, aber gebe auf: Wie würde eine tiefe Abfrage dieses Problem lösen? –