Sie können die Anzahl der Kinder über erhalten
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Ich glaube jedoch, dass dies den gesamten Unterbaum dieses Knotens vom Server abruft. Bei großen Listen scheint dies RAM und Latenzzeitintensiv zu sein. Gibt es eine Möglichkeit, die Anzahl (und / oder eine Liste von Kindernamen) zu ermitteln, ohne das Ganze abzurufen?
Antworten:
Das von Ihnen angegebene Code-Snippet lädt tatsächlich den gesamten Datensatz und zählt ihn dann clientseitig, was bei großen Datenmengen sehr langsam sein kann.
Firebase bietet derzeit keine Möglichkeit, Kinder zu zählen, ohne Daten zu laden. Wir planen jedoch, diese hinzuzufügen.
Derzeit besteht eine Lösung darin, einen Zähler für die Anzahl der untergeordneten Elemente zu verwalten und ihn jedes Mal zu aktualisieren, wenn Sie ein neues untergeordnetes Element hinzufügen. Sie können eine Transaktion verwenden, um Elemente zu zählen, wie in diesem Code zur Verfolgung von Upvodes:
Weitere Informationen finden Sie unter https://www.firebase.com/docs/transactions.html
UPDATE: Firebase hat kürzlich Cloud-Funktionen veröffentlicht. Mit Cloud-Funktionen müssen Sie keinen eigenen Server erstellen. Sie können einfach JavaScript-Funktionen schreiben und in Firebase hochladen. Firebase ist dafür verantwortlich, Funktionen auszulösen, wenn ein Ereignis eintritt.
Wenn Sie beispielsweise Upvotes zählen möchten, sollten Sie eine ähnliche Struktur erstellen:
Schreiben Sie dann eine Javascript-Funktion, um die Anzahl der
upvotes_count
neuen Schreibvorgänge auf demupvotes
Knoten zu erhöhen .In der Dokumentation erfahren Sie, wie Sie mit Cloud-Funktionen beginnen .
Ein weiteres Beispiel für das Zählen von Posts finden Sie hier: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Update Januar 2018
Die Firebase-Dokumente haben sich geändert, anstatt dass
event
wir jetztchange
und habencontext
.Das angegebene Beispiel löst einen Fehler aus, der
event.data
undefiniert ist. Dieses Muster scheint besser zu funktionieren:`` `
quelle
Dies ist etwas spät im Spiel, da einige andere bereits gut geantwortet haben, aber ich werde Ihnen mitteilen, wie ich es implementieren könnte.
Dies hängt davon ab, dass die Firebase-REST-API einen
shallow=true
Parameter bietet .Angenommen, Sie haben ein
post
Objekt und jedes kann eine Reihe voncomments
folgenden Elementen haben :Sie möchten offensichtlich nicht alle Kommentare abrufen, sondern nur die Anzahl der Kommentare.
Angenommen, Sie haben den Schlüssel für einen Beitrag, können Sie eine
GET
Anfrage an sendenhttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.Dies gibt ein Objekt aus Schlüssel-Wert-Paaren zurück, wobei jeder Schlüssel der Schlüssel eines Kommentars ist und sein Wert ist
true
:Die Größe dieser Antwort ist viel kleiner als das Anfordern der entsprechenden Daten. Jetzt können Sie die Anzahl der Schlüssel in der Antwort berechnen, um Ihren Wert zu ermitteln (z
Object.keys(result).length
. B. commentCount = ).Dies löst Ihr Problem möglicherweise nicht vollständig, da Sie immer noch die Anzahl der zurückgegebenen Schlüssel berechnen und den Wert bei Änderungen nicht unbedingt abonnieren können. Die Größe der zurückgegebenen Daten wird jedoch erheblich reduziert, ohne dass Änderungen an Ihren erforderlich sind Schema.
quelle
.json
an das Ende der URL anhängen müssen , zum Beispiel:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Speichern Sie die Zählung, während Sie fortfahren - und verwenden Sie die Validierung, um sie durchzusetzen. Ich habe das zusammen gehackt - um eine Anzahl einzigartiger Stimmen und Zählungen zu erhalten, die immer wieder auftauchen!. Aber diesmal habe ich meinen Vorschlag getestet! (ungeachtet von Fehlern beim Ausschneiden / Einfügen!).
Der ‚Trick‘ ist hier um den Knoten zu verwenden Priorität als die Stimme ...
Die Daten sind:
Abstimmung / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, Priorität = thisVotesCount Abstimmung / $ issueBeingVotedOn / count = 'Benutzer /' + $ idOfLastVoter, Priorität = CountofLastVote
Benutzer kann nur einmal abstimmen && Anzahl muss eins höher sein als aktuelle Anzahl && Datenwert muss gleich Priorität sein.
count (letzter Wähler wirklich) - Abstimmung muss vorhanden sein und die Anzahl entspricht newcount, && newcount (Priorität) kann nur um eins steigen.
Testskript zum Hinzufügen von 10 Stimmen von verschiedenen Benutzern (in diesem Beispiel ist die ID gefälscht, sollte der Benutzer auth.uid in der Produktion sein). Countdown bis (i--) 10, um zu sehen, dass die Validierung fehlschlägt.
Das "Risiko" besteht hier darin, dass eine Stimme abgegeben wird, die Anzahl jedoch nicht aktualisiert wird (Haking oder Skriptfehler). Aus diesem Grund haben die Stimmen eine eindeutige "Priorität" - das Skript sollte zunächst sicherstellen, dass keine Stimme mit einer höheren Priorität als der aktuellen Anzahl vorhanden ist. Wenn diese Transaktion abgeschlossen sein sollte, bevor sie ihre eigene ausführt, lassen Sie Ihre Kunden bereinigen für dich :)
Die Zählung muss vor dem Start mit einer Priorität initialisiert werden - Forge lässt dies nicht zu, daher wird ein Stub-Skript benötigt (bevor die Validierung aktiv ist!).
quelle
Schreiben Sie eine Cloud-Funktion in und aktualisieren Sie die Knotenanzahl.
Siehe: https://firebase.google.com/docs/functions/database-events
root-- | | -users (dieser Knoten enthält alle Benutzerlisten) |
| -count | -userscount: (Dieser Knoten wird dynamisch durch die Cloud-Funktion mit der Benutzeranzahl hinzugefügt.)
quelle