Wie können paginierte Kinder in Firebase in aufsteigender oder absteigender Reihenfolge abgerufen werden?

8

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?

    
cayblood 28.11.2014, 21:02
quelle

1 Antwort

11

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:

  • Ich sehe keinen Vorteil gegenüber der Verwendung eines indizierten Feldes 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)
  • Für viele Anwendungsfälle schwer zu warten, um den Wert der Priorität für
  • festzulegen

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.

%Vor%

Probleme:

  • Es fügt der App mehr Komplexität hinzu: zusätzliche Felder müssen gepflegt werden
  • Kann die Atomarität des Feldes unterbrechen (zum Beispiel kann ein score -Feld sofort aktualisiert werden, nicht sicher, ob es mit zwei Feldern möglich ist, einem positiven und einem negativen)
  • Ich denke, diese Problemumgehung wurde verwendet, als es nur 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:

  • Die API-Dokumentation besagt, dass nur der geordnete Schlüsselwert als 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:

%Vor%

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:

%Vor%

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 !! : -)

    
Pandaiolo 02.11.2015, 18:51
quelle

Tags und Links