Angenommen, ich verwende Firebase für ein Kommentarsystem und möchte die Kommentare für ein bestimmtes Thema abrufen, aber es gibt so viele Kommentare in einem Thema, dass ich sie nicht alle auf einmal abrufen möchte. Ich möchte auch, dass die neuesten Kommentare oben angezeigt werden.
Es scheint, dass die einzige Möglichkeit, Firebase-Datensätze in umgekehrter Reihenfolge anzuzeigen, darin besteht, sie alle abzurufen und dann in umgekehrter Reihenfolge zu durchlaufen.
Dies könnte bei großen Datasets, insbesondere bei mobilen Clients, sehr unhandlich werden.
Gibt es einen besseren Weg? Was ist die generische und bevorzugte Lösung für die Abfrage von paginierten Daten aus Firebase in aufsteigender oder absteigender Reihenfolge?
Aktualisierte Antwort
@Tyler Antwort stackoverflow.com/a/38024909/681290 ist eine aktuellere und bequemere Antwort für diese Frage
TL; DR
Es gibt keine Lösung, wenn Sie Folgendes tun möchten:
%Vor%Außerdem gibt es in Firebase github nicht unterstützte Tools mit Paginierung , allerdings nur in aufsteigender Reihenfolge .
Ansonsten , hier sind die nächsten möglichen Lösungen, die ich selbst gefunden habe oder bisher im Internet. Ich interpretierte die Frage absichtlich als generisch, nicht nur über Zeitfelder wie vom OP gefordert.
Prioritäten verwenden
Das Ziel besteht darin, setWithPriority()
und setPriority()
für Kinder zu verwenden, um später mit orderByPriority()
geordnete Daten abrufen zu können.
Probleme:
priority
? (Tatsächlich wird die Priorität als ein zugrunde liegendes Feld namens .priority
gespeichert, das Sie beim Exportieren von JSON-Daten sehen können) Redundante untergeordnete Felder mit negativen Daten
Beispielsweise können wir ein negatives Timestamp timeRev
indexiertes Feld zusätzlich zu time
verwenden, um die neuesten Elemente zuerst abrufen zu können.
Probleme:
score
-Feld sofort aktualisiert werden, nicht sicher, ob es mit zwei Feldern möglich ist, einem positiven und einem negativen) limit()
in der Firebase-API gab, aber jetzt ist sie veraltet, da wir limitToFist()
, limitToLast()
und Bereichsabfragen (siehe unten) verwenden können Verwenden von limitToLast () und endAt()
range-Abfragen
Damit vermeiden wir negative und redundante Feld:
%Vor%Dies sollte bei Timestamp-Feldern ziemlich effektiv sein, da dies normalerweise ein eindeutiges Feld ist.
Das resultierende Array von Elementen muss vor der Verwendung einfach umgekehrt werden. (Denken Sie daran, dass Array.prototype.reverse()
veränderbar ist, so dass es Ihr Array ändert)
Probleme:
startAt
oder endAt
boundary festgelegt werden kann. Wenn viele Elemente denselben Wert haben, kann das Dataset nicht in Offsets mit fester Länge aufgeteilt werden. Beispiel mit den folgenden Elementen, die einen score
-Wert enthalten:
Erste Seitenabfrage, um die besten Punkte zu erhalten:
%Vor%Ergebnisse:
%Vor% Beachten Sie, dass das erste Element der Teilmenge ein 1
score aufweist. Daher versuchen wir, die vorherige Seite durch Auswahl aller Elemente mit der Punktzahl 1
oder weniger zu erhalten:
Mit dieser Abfrage erhalten wir b,c,d
-Elemente anstelle von a,b,c
-Elemente, was gemäß den API-Dokumenten erwartet wird, vorausgesetzt, dass endAt(1)
inklusive ist, also wird versucht, alle Punkte von 1 und hat keine Möglichkeit zu sortieren, die schon vorher zurückgegeben wurden.
Workaround
Dies kann gemildert werden, indem nicht erwartet wird, dass jede Teilmenge die gleiche Menge an Datensätzen enthält und diejenigen, die bereits geladen wurden, verworfen werden.
Aber, wenn die ersten Millionen Nutzer meiner App eine 0
Punktzahl haben, kann diese Teilmenge nicht paginiert werden, weil die endAt
offset nutzlos ist, da sie auf value anstelle der Anzahl der Datensätze .
Ich sehe keine Abhilfe für diesen Anwendungsfall, ich denke, Firebase ist nicht dafür gedacht: -)
Bearbeiten: Am Ende verwende ich Algolia für alle Suchzwecke. Es ist eine wirklich nette API, und ich hoffe, dass Google schließlich Algolia erhält, um sowohl Firebase & amp; Algolia, da ihre Komplementarität fast 100% beträgt! Haftungsausschluss: keine Aktien im Besitz !! : -)
Tags und Links javascript firebase pagination