2016-05-08 13 views
1

Ich habe eine Struktur von Objekten in Firebase wie folgt aussehen:von Kind Kind Abfragen

-KBP27k4iOTT2m873xSE 
    categories 
     Geography: true 
     Oceania: true 
    correctanswer: "Yaren (de facto)" 
    languages: "English" 
    question: "Nauru" 
    questiontype: "Text" 
    wronganswer1: "Majuro" 
    wronganswer2: "Mata-Utu" 
    wronganswer3: "Suva" 

Ich versuche Objekte nach Kategorien zu finden, so zum Beispiel ich alle Objekte möchten, welche die Kategorie angezeigt Stellen Sie auf "Ozeanien" ein.

Ich benutze Swift und ich kann nicht wirklich scheinen, das Konzept zu verstehen, wie man die Daten abfragt.

Meine Anfrage rechts sieht nun wie folgt aus:

ref.queryEqualToValue("", childKey: "categories").queryOrderedByChild("Oceania") 

Wo ref den Verweis auf Firebase in diesem speziellen Weg.

Wie auch immer ich es versucht habe, ich bekomme immer ALLE Daten zurück, anstatt nur die Objekte der Kategorie Ozeanien.

Meine Daten werden wie folgt strukturiert: baseurl/questions/

Wie Sie in dem Objekt Beispiel einer siehe Frage hinzugefügt mehr Kategorien haben kann, so von dem, was ich verstanden habe ist es am besten einen Verweis auf die Kategorien haben in Ihrem Objekte.

Ich konnte meine Struktur baseurl/questions/oceania/uniqueids/, ändern, aber dann würde ich mehrere Eintragungen, die gleichen Daten, aber mit unterschiedlichen uniqueid, weil die Frage beide wäre unter den Kategorien oceania und geography Geschenk.

durch die Struktur mit baseurl/questions/oceania/ und baseurl/questions/geography Ich könnte auch nur hinzufügen unique ids unter oceania und geography, die stattdessen zu einem bestimmten unique id innerhalb baseurl/questions/uniqueids Punkte, aber das würde bedeuten, ich muss den Überblick über viele Referenzen halten würde. Eine Beziehungstabelle sozusagen erstellen.

Ich frage mich, ob das der richtige Weg ist oder? Sollte ich meine Daten umstrukturieren? Die App ist noch nicht in Produktion, daher ist es möglich, die Daten komplett zu restrukturieren, ohne größere Konsequenzen zu haben, außer dass ich meinen Code neu schreiben müsste, der Daten an Firebase weiterleitet.

Lassen Sie mich wissen, wenn dies alles Sinn und sorry für die Wand des Textes nicht :-) ich diese Arbeit sollte denken

+0

Das ist ziemlich einfach ist mit einer [Firebase Tief Abfrage] (https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html) – Jay

Antwort

3

machen:

ref.queryOrderedByChild("categories/Oceania").queryEqualToValue(true) 
+0

Ich habe Angst, das hilft auch nicht. Ich vermute, das Problem ist der Schlüssel des Objekts, eine eindeutige ID, die beim Einfügen der Objekte in Firebase generiert wird. Ich habe meine Frage auch mit der Frage aktualisiert, die meiner Meinung nach funktionieren würde, aber nicht. – Darwind

+0

@Darwind Tims Antwort ist genau richtig und funktioniert so, dass sie akzeptiert werden sollte. Ich habe auch einen zusätzlichen Code in einer Antwort hinzugefügt. Aber das ist richtig. – Jay

+0

@Jay Nun, es war offensichtlich, aber ich habe 'ref.observeSingleEventOfType (.Value ...' und das hat immer alle Elemente zurückgegeben. Ich denke, es ist noch ein langer Weg für mich - Ihre Ergänzung half, das Rätsel zu lösen: -) – Darwind

4

zusätzlichen Code zu Tims Hinzufügen Antwort für zukünftige Referenz.

Verwenden Sie einfach eine tiefe Abfrage. Der Schlüssel des übergeordneten Objekts ist nicht das, was abgefragt wird, daher wird es ignoriert. Es spielt keine Rolle, ob es sich um einen Schlüssel handelt, der von autoId oder einem Dinosauriernamen generiert wird - die Abfrage bezieht sich auf die untergeordneten Objekte und der übergeordnete Schlüssel (Schlüssel) wird in snapshot.key zurückgegeben.

auf Firebase Struktur Basierend, wird dies jedes Kind Knoten abrufen, wo Ozeanien wahr ist, einer nach dem anderen:

 let questionsRef = Firebase(url:"https://baseurl/questions") 
     questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true) 
      .observeEventType(.ChildAdded, withBlock: { snapshot in 
       print(snapshot) 
     }) 

Edit: Eine Frage auf einmal alle Werte laden (.value kam über) anstelle von einem zu einem Zeitpunkt (.childAdded)

 let questionsRef = Firebase(url:"https://baseurl/questions") 
     questionsRef.queryOrderedByChild("categories/Oceania").queryEqualToValue(true) 
       .observeSingleEventOfType(.Value, withBlock: { snapshot in 
       print(snapshot) 
     }) 

Ergebnisse in (meine Firebase Struktur ist ein wenig anders, aber Sie bekommen die Idee) uid_1 nicht haben Ozeanien = true, so dass es aus der Abfrage Ergebnisse weggelassen wurde.

Snap (users) { 
    "uid_0" =  { 
     categories =   { 
      Oceania = 1; 
     }; 
     email = "[email protected]"; 
     "first_name" = Bill; 
    }; 
    "uid_2" =  { 
     categories =   { 
      Oceania = 1; 
     }; 
     "first_name" = Peter; 
    }; 
}