2015-05-11 19 views
7

Von allem, was ich gelesen habe, scheint es nicht möglich, einen mehrstufigen Wert abzufragen. Meine Datenstruktur wie folgt aussieht:Firebase Abfrage Enkel/Multilevel-Abfrage

{ 
"dinosaurs": { 
    "bruhathkayosaurus": { 
     "meta":{ 
      "addedBy":"John", 
      "addedDate":"02021987" 
     }, 
     "appeared": -70000000, 
     "height": 25 
    }, 
    "lambeosaurus": { 
     "meta":{ 
      "addedBy":"Peter", 
      "addedDate":"12041987" 
     }, 
     "appeared": -76000000, 
     "height": 2.1 
    } 
} 
} 

Ohne die Schlüsselnamen der Dinosaurier zu kennen, ist es trotzdem, die Meta-Knoten nur Elemente hinzugefügt von John Abrufen abzufragen.

In JS So etwas wie:

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta/addedBy") 
    .equalTo('Peter') 
    .on("child_added", function(snapshot) { 
     console.log(snapshot); 
    }); 

Hacky Lösungen Es gibt aber keine sind skalierbar, sollte ich diese Daten abzuflachen gerade?

Edit:

Ich brauche einen Code-Review ... wäre dies eine akzeptable Lösung sein?

var ref = new Firebase('test.firebaseio.com/dinosaurs'); 
    ref.orderByChild("meta") 
    .on('child_added',function(snap1){ 
     snap1.ref().orderByChild("addedBy") 
     .equalTo("Peter") 
     .on('child_added', function(snap2) { 
      console.log(snap2.val()); 
     }) 
    }); 
+1

Seien Sie vorsichtig: Wenn Sie ein 'on' haben, sollten Sie immer überlegen, wann das entsprechende' off' passiert. Für Top-Level-'On's das kann sein, wenn die Seite/App geschlossen ist, aber Ihr' On' im 'Child_Added'-Callback führt zu einer Anhäufung von Listenern im Laufe der Zeit. Der übliche Weg, dies zu lösen, ist die Verwendung von "einmal" in der Schleife, was jedoch oft zu einer suboptimalen Leistung führt. –

+2

Siehe auch: http://stackoverflow.com/questions/30151012/is-there-a-way-in-angularfire-to-query-for-matching-and-condition –

Antwort

5

Abfragen können nur 1 Ebene tief sein. Es gibt eine Reihe von Lösungen, aber die Verflachung Ihrer Daten und das Verknüpfen/Referenzieren ist eine Option.

Im obigen Beispiel könnten Sie einen weiteren Knoten erstellen, der die Benutzernamen (Eltern) mit den hinzugefügten Dinosauriern (Kinder) verbindet. Dann kann John Node gelesen werden und sofort wissen, welche Dinosaurier er hinzugefügt hat. Dann können Sie auf andere relevante Daten über diesen Dino zugreifen; Datum hinzugefügt, erschien, Höhe usw.

Sie werden wahrscheinlich UIDs anstelle von Namen verwenden wollen, aber Sie bekommen die Idee.

Außerdem ist es nicht klar, warum es ein Meta-Knoten im Beispiel aufgeführt, so dass es auf dieser Weise abgeflacht werden könnte:

"dinosaurs": { 
    "bruhathkayosaurus": { 
     "addedBy":"John" 
     "addedDate":"02021987" 
     "appeared": -70000000 
     "height": 25 
    }, 

bearbeitet Januar 2016: Seit dieser Antwort hat Firebase Tief Abfragen so können Sie tiefer abfragen als 1 Ebene.