2016-05-05 3 views
2

In meiner App "React-Native" habe ich ein Array mit bestimmten Benutzern, deren Werte ich von Firebase abrufen möchte. Was ist der effizienteste Weg? Derzeit bin ich Looping das Array durch und machen eine neue Anforderung für jeden (einen entsprechenden Code unten):Wie bekomme ich eine Gruppe von Objekten von Firebase?

const usersRef = new Firebase(`${ config.FIREBASE_ROOT }/users`) 

for (var key in usersArray) { 
    var userRef = usersRef.child(key); 
    //do stuff here 
} 

aber ich fühle mich nicht sehr effizient ist und es macht mehrere Anfragen an die Datenbank. Gibt es eine Möglichkeit, das Array zu übergeben und diese Elemente von Firebase zu erhalten, alles in einem Aufruf? Vielen Dank.

Firebase Datenstruktur:

{ 
    "items" : [ { 
    "description" : "fuzzy socks", 
    "type" : "toy" 
    }, { 
    "description" : "bouncy ball", 
    "type" : "toy" 
    }, { 
    "description" : "scrabble", 
    "type" : "game" 
    }, { 
    "description" : "construction paper", 
    "type" : "crafts" 
    } ], 
"users" : [ { 
    "itemList" : [ 1, 2, 3, 4 ], 
    "description" : "brown", 
    }, { 
    "itemList" : [ 5, 6, 7 ], 
    "description" : "green", 
    }, { 
    "itemList" : [ 8, 9, 10 ], 
    "description" : "blue", 
    }, { 
    "itemList" : [ 11, 12, 13 ], 
    "description" : "yellow", 
    } ] 
} 

Vereinfachte Anwendungsfall: In einem Anwendungsfall, ich möchte nur Informationen über 2 der Nutzer erhalten (aus allen Benutzern ich in Firebase gespeichert haben - davon ausgehen, es ist viel mehr als nur die 4 in der Struktur oben). Also, ich habe das Array importantUsers:

var importantUsers = [0, 3] 

Dann möchte ich eine Anfrage senden, um Feuerbasis, dass nur die Datenbank-Abfragen für die mit diesen userID Werte verknüpften Werte (so passieren irgendwie in dem Array Firebase für ein Ergebnis). Rückgabewerte würden wie folgt sein:

0: itemList: [1,2,3,4], description: brown 
3: itemList: [11,12,13], description: yellow 

Meine Motivation für die Datenbank für mehrere Benutzer auf einmal abzufragen (anstatt eine separate ref für Benutzer erstellen 0 und Benutzer 3) nicht mehr Anrufe auf Firebase gemacht haben. Gibt es einen Weg, dies zu tun?

+0

Können Sie Ihre Firebase-Datenstruktur posten? Bitte als Text posten (keine Bilder). Der Text kann über das Firebase Dashboard-> Export-Button abgerufen werden. – Jay

+0

@Jay gerade mit diesem aktualisiert. – user3802348

+0

Wenn Sie sagen "ein Array von bestimmten Benutzern deren Werte", was definiert sie als ein Benutzer, was macht sie spezifisch und welchen Wert interessieren Sie? In Ihrer Firebase-Struktur gibt es einen Benutzerknoten und dann ein Array von Wörterbüchern, die Schlüsselwertpaare von itemList (das ein Array ist) und Beschreibung enthalten, von denen keine ein Benutzer ist. Fragen Sie, wie Sie auf eine bestimmte Elementliste innerhalb des Arrays im Benutzerknoten zugreifen? – Jay

Antwort

2

Also, was Sie nach ist eine SQL ‚in‘ Typ-Abfrage. Wählen Sie in [0,2]. Um eine Anzahl von Benutzern aus einer Liste auszuwählen.

Die zusätzliche Herausforderung in Ihrer Frage ist, dass die Benutzer, die Sie interessieren, zufällig sind, so dass Sie .startAt und .endAt nicht verwenden können, und es gibt keine andere Beziehung zwischen den Benutzern.

Firebase hat keine direkte Unterstützung für "in", "und" oder "Arten der Abfrage, aber es gibt eine Reihe von Möglichkeiten, dies zu erreichen.

Wie wäre es damit: Kennzeichnen Sie die Benutzer wollen und dann mit einer einzigen Abfrage, lesen sie in

Zuerst Sie mit einem typischen Firebase/Benutzer-Knoten mit dem Zusatz eines ‚ausgewählt‘ Kind beginnen werde. Knoten (dies kann zunächst verzichtet aber zeige ich es hier als Platzhalter)

users 
uid_0 
    name: "Bud" 
    selected: false 
uid_1 
    name: "Henry" 
    selected: false 
uid_2 
    name: "Billy" 
    selected: false 

Dann brauchen wir einige zufällige uID, sagen uid_0 und uid_2 und speichern die in einem Array. Denken Sie daran, dass wir die von Firebase generierte uid verwenden würden, aber wir verwenden zur Vereinfachung einfach uid_0, uid_1 usw.

Mit nur zwei Benutzern können Sie nur beobachten, SingleEventOfType auf jedem der beiden Knoten, keine große Sache.

Wenn jedoch 100 zufällige Benutzer oder 1000 benötigt werden, sollten 1000 separate Abfragen oder die Beobachtung von SingleEvent's vermieden werden. Aber, setValue ist blitzartig schnell (keine zurückgegebenen Daten) also ....

unserer Benutzer ref Get

let usersRef = myRootRef.ChildbyAppendingPath("users") 

Wir kennen den Weg zu jedem der 100 Benutzer wir eine Näherung durch Iteration über das Array wollen, dass diese Refs und auf true gesetzt

for uid in uidArray { 
    let thisUserRef = usersRef.childByAppendingPath(uid) 
    let selectedRef = thisUserRef.childByAppendingPath("selected") 
    selectedRef.setValue(true) 
} 

Dann ausgewählt zu bauen, Sie können für alle Benutzer im usersRef abfragen, wo das ausgewählte Kind = true ist.

Sobald Sie sie haben, um aufzuräumen, über die zurückgegebenen Benutzer durchlaufen und die auszuwählenden false oder nil

Die kühle Sache über diese eingestellt ist, dass setValue bis 100 oder 1000 Benutzer sehr schnell ohne Aufwand sprengen kann Setzen Sie das ausgewählte Kind auf "True". Dann kann eine einzelne Abfrage die gewünschten Werte zurückgeben.

Scheint fast umgekehrt in der Logik zu schreiben, um dann wieder einzulesen, aber ich bin mir ziemlich sicher, dass es wesentlich besser ist, als über ein Array zu iterieren und 1000 Abfragen oder Beobachter zu generieren.

(Leute Firebase kann mich kontrollieren, dass man auf)

Ein anderer Gedanke ist, dass, wenn ein Benutzer sagen ist, in einer Liste auf andere Benutzer klicken stellen Sie = true gewählt haben, können wie sie klicken und dann Abfrage für diejenigen, wenn der Benutzer fertig ist.

+0

Dies ist eine großartige, innovative Lösung! Vielen Dank! – user3802348

0

Sie bindAsArray or bindAsObject von ReactFire

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/items"); 
    this.bindAsArray(ref, "items"); 

Dann könnten Sie eine Schleife über das Array/Objekt verwenden könnte als ohne zusätzliche Abfragen benötigt

+0

Hmm, aber wird das nicht die ganze Liste von Gegenständen greifen? Ich möchte nur eine Teilmenge von ihnen, z. B. Artikel mit bestimmten IDs. Gibt es eine Möglichkeit, eine Liste der IDs, die ich an Firebase senden möchte, zu übergeben und nur Ergebnisse für diese bestimmten Elemente zu erhalten? – user3802348

Verwandte Themen