2017-03-06 5 views
0

Hier ist meine Firebase Datenstruktur:Firebase-Datenbank Zugriff auf mehrere Datensätze

{ 
    "companies": { 
    "-Ke_b8p6OBaz1VCeovAH": { 
     "display_name": "First User's Company", 
     "users": { 
     "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin" 
     } 
    }, 
    "-Ke_cmhDaIeGJjFwsDI1": { 
     "display_name": "First User's Second Company", 
     "users": { 
     "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin" 
     } 
    }, 
    "-Ke_b9OgwY2IBdj5szmJ": { 
     "display_name": "Second User's Company", 
     "users": { 
     "5XcpmN7DgEWNnmWZucyQiOh4TJt2": "admin" 
     } 
    } 
    }, 

    "users": { 
    "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": { 
     "display_name": "First User" 
    }, 
    "5XcpmN7DgEWNnmWZucyQiOh4TJt2": { 
     "display_name": "Second User" 
    } 
    } 
} 

Ich versuche, eine Abfrage auf diese Daten zu tun (via REST zum Beispiel.):

example.firebase.com/companies.json?orderBy="users/ir7jjLPA3fXCVsdc4OzzSiH9RJd2" 

Meine Hoffnung ist, zurückzukehren

{ 
    "-Ke_b8p6OBaz1VCeovAH": { 
    "display_name": "First User's Company", 
    "users": { 
     "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin" 
    } 
    }, 
    "-Ke_cmhDaIeGJjFwsDI1": { 
    "display_name": "First User's Second Company", 
    "users": { 
     "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin" 
    } 
    } 
} 

Stattdessen bekomme ich

{ 
    "error": "Index not defined, add \".indexOn\": \"users/ir7jjLPA3fXCVsdc4OzzSiH9RJd2\", for path \"/companies\", to the rules" 
} 

Hier ist meine Firebase Sicherheit Regeln

{ 
    "rules": { 
    ".read": true, 
    ".write": true, 

    // Companies 
    "companies": { 
     ".indexOn": ["display_name", "users"], 
    } 
    } 
} 

Es ist nicht möglich, Sicherheitsregeln für jeden Benutzer der Indizierung zu aktualisieren, so wie würde ich damit umgehen?

Antwort

1

Firebase unterstützt keine "Filterung" in der Klasse, die Sie gewohnt sind. Mit Ihrer aktuellen Datenstruktur, würden Sie entweder brauchen:

  1. Abfrage alle Unternehmen und Filter auf dem Ziel Benutzer clientseitige oder
  2. Umstrukturieren Ihrer Sammlung Benutzer ein Attribut hinzufügen angibt, welche Unternehmen der Benutzer eine war Administrator von. Sie können dann den Benutzerdatensatz in einer Abfrage abrufen und dann in einer Sekunde die Datensätze für die Firmen abfragen, für die der Benutzer Administrator ist.

Diese Optionen klingen schrecklich, aber glauben Sie es oder nicht, das war speziell der Fall Firebase wurde entwickelt, um "schnell" im Umgang zu sein. Es gleicht Ineffizienzen bei Code/Abfragen durch massive Skalierung aus, so dass Sie viele SQL-spezifische Best Practices vergessen müssen, wie die Normalisierung von Daten, effiziente Query-/Join-Operationen usw. Trotz allem, was nach zusätzlicher Arbeit aussieht Wenn Sie die Operationen tatsächlich benchmarken (und insbesondere wenn Sie Optionen wie Persistenz/Caching aktivieren), können Sie die SQL-Umgebungsleistung sogar mit diesen zusätzlichen Schritten erreichen oder sogar übertreffen. Stellen Sie sich RISC vs CISC vor, wobei RISC Firebase und CISC SQL ist.

+2

"Firebase unterstützt keine Filterung/Suche jeglicher Art." Diese Aussage scheint in diesem Zusammenhang irreführend zu sein. Nicht per se suchen, aber 'orderBy' +' equalTo' ist ein einfacher Filter und für @ Codys Problem anwendbar. Ich bin nicht gut in der REST-API, aber sortiere auf ein Kind eines Kindes, namens [tiefe Abfrage] (https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html), ist sicherlich in den SDKs möglich. –

+0

Ich würde diesen ersten Satz in der Tat umformulieren, da es in der Firebase-Dokumentation einen vollständigen Abschnitt zum Bestellen und Filtern von Daten gibt: https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data. –

+0

@TravisChristian - Ich habe diesen Artikel gelesen, genauso wie den von Frank geposteten. Ich bin jedoch nicht in der Lage gewesen, die Art und Weise, auf die ich oben Bezug nehme, abzufragen. Mit tiefen Abfrage sie verweisen, die Schlüssel sind immer die gleichen, d. H. 'Height',' weight' usw. Ich bin auf der Suche nach Abfragen auf Schlüssel, die sich ändern werden. Schlüssel, die Benutzer-UID sind. Das Speichern dieser IDs als Schlüssel in einem Wörterbuch ist auch die empfohlene Speicherpraxis in der Firebase-Datenbank. https://firebase.google.com/docs/database/web/structure-data#fanout –

Verwandte Themen