2016-04-13 7 views
0

ich Firebase recht neu bin und haben eine Rankings App, wo meine Struktur zur Zeit wie folgt aussieht:Firebase: Suchen Kind-Knoten, die eine eindeutige ID

{ 
    "Rankings" : { 
    "-KFGX5H3rLSnpPvupakm" : { 
     "Sports Teams" : { 
     "Red sox" : 1, 
     "Warriors" : 3, 
     "Yankees" : 2 
     } 
    }, 
    "-KFGZkwAIl817CLDLmMp" : { 
     "Beers" : { 
     "Bud light" : 3, 
     "Coors" : 2, 
     "Pbr" : 4 
     } 
    } 
    } 
} 

Ich verwende childIDs so kann ich sortiere diese chronologisch. Wenn ich Rankings nach Namen suchen möchte, wie kann ich die Kind-ID umgehen?

Zum Beispiel, wenn ein Benutzer nach Rankings sucht mit dem Begriff "Sport", wie kann ich meine Rankings Baum durch die Suche nach allen Rankings mit "Sport"?

+0

Sie haben ein Bild des JSON Baum in Ihrer Frage enthalten. Bitte ersetzen Sie dies durch den tatsächlichen JSON als Text, den Sie einfach erhalten, indem Sie auf die Schaltfläche "Exportieren" in Ihrer Firebase-Datenbank klicken. Da der JSON als Text durchsuchbar ist, können wir ihn einfach verwenden, um mit Ihren tatsächlichen Daten zu testen und sie in unserer Antwort zu verwenden, und im Allgemeinen ist dies nur eine gute Sache. –

+0

Entschuldigungen @FrankvanPuffelen, siehe bearbeitet – chicobermuda

Antwort

0

Diese Art der Tiefenabfrage auf dynamischen Pfaden ist nicht möglich mit Firebase (noch mit vielen anderen NoSQL-Datenbanken). Sie müssen einen sogenannten Index einrichten, der die Schlüssel, nach denen Sie suchen möchten, den gewünschten Werten zuordnet.

{ 
    "Rankings" : { 
    "-KFGX5H3rLSnpPvupakm" : { 
     "Sports Teams" : { 
     "Red sox" : 1, 
     "Warriors" : 3, 
     "Yankees" : 2 
     } 
    }, 
    "-KFGZkwAIl817CLDLmMp" : { 
     "Beers" : { 
     "Bud light" : 3, 
     "Coors" : 2, 
     "Pbr" : 4 
     } 
    } 
    }, 
    "SearchTerms": { 
     "Red sox" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Warriors" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Yankees" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Bud light" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     }, 
     "Coors" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     }, 
     "Pbr" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     } 
    } 
} 

Dieser Prozess wird Ihre Daten genannt Denormalisierung und es ist in this blog post im Firebase documentation on structuring data und in diesen beschrieben. Und wahrscheinlich in einem halben Dutzend ähnlicher Antworten, die ich kürzlich gegeben habe.

+0

Wäre es in "SearchTerms" sinnvoller, einen Index zu verwenden, der einem durchsuchbaren Schlüssel entspricht, den ich dann abfragen kann, oder alle Daten unter "SearchTerms" wie unter " Rankings, "ohne die' autoId', also kann ich nur 1 Abfrage ausgeben? – chicobermuda

+0

Beide haben ihre Vorzüge. Überschätzen Sie den Overhead dieser Lookups nicht. Siehe [diese Antwort] (http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786# 35932786), warum Firebase-Suchschleifen möglicherweise schneller als erwartet sind. –

0

Ich konnte die Werte der child node-id's bekommen.

Hier ist mein Beispielcode:

LOCATION_URL.queryOrderedByChild("email").queryEqualToValue(FIRAuth.auth()?.currentUser?.email).observeEventType(.Value, withBlock: { snapShot in 

     let enumerator = snapShot.children 

     while let rest = enumerator.nextObject() { 

      var shot = rest.childSnapshotForPath(rest.key) 
      // child node ID 
      print(shot.key) 

     } 
    }) 

Ich hoffe, das hilft Ihnen .. Mit freundlichen Grüßen, Nazar Medeiros