2014-06-19 8 views
5

Ich habe eine Anwendung, in der ich eine gewisse Anzahl von Anfangsdaten laden möchte (durchgeführt mit Firebase.once('value')) und dann später möchte ich Ereignisse von Kind-Knoten erhalten, die hinzugefügt wurden zu dieser Firebase-Referenz.Firebase child_added, ohne zuerst alle Daten zu laden

Dafür würde ich gerne Firebase.on('child_added') verwenden, aber nach der Definition (und in der Praxis gesehen) lädt es alle Daten bei dieser Firebase-Referenz zuerst.

Gibt es eine Möglichkeit, dieses Verhalten zu umgehen und nur auf Ereignisse child_added zu hören. Außerdem sind Umgehungslösungen wie das Dumping der anfänglichen Datenmenge keine Lösungen (stellen Sie sich ein Dataset mit mehr als einer Million Datenpunkten vor - ich möchte nicht jeden Datenpunkt haben, auf den nur gewartet werden soll, wenn ein hinzugefügt wird!).

EDIT: Firebase.on('child_added') kann mit limit() kombiniert werden, um die Datenmenge zu begrenzen, die von der ersten Anfrage kommt. Wahrscheinlich wird für meine Anwendung nur ein Datenpunkt zum Firebase zu einem Zeitpunkt hinzugefügt, so dass ich Firebase.limit(1).on('child_added') verwendet habe, was die Menge der initialen Daten begrenzt, die auf einen einzelnen Datenpunkt geladen werden. Aber ich mag diese Problemumgehung aus zwei Gründen nicht:

  1. Es ist immer noch ein Workaround. Ich muss immer noch Daten ignorieren, die ich nicht ignorieren sollte.
  2. Wenn aus irgendeinem Grund die Natur meiner Anwendung geändert werden sollte und ich mehrere Kinder zum Firebase-Verweis auf einmal hinzufügen sollte - würde die Anwendung eine limit(1) begrenzen, die alle hinzugefügten Kinder empfängt? Ich bin mir nicht sicher, ob dies der Fall ist oder ob child_added für jedes einzelne hinzugefügte Kind aufgerufen wird, unabhängig davon, ob sie als Stapel hinzugefügt wurden.

Es scheint eine true/false Flagge als Argument für den Anruf wie die Bereitstellung eine schöne Lösung wäre, aber ich werde abwarten, ob eine Antwort gibt es Ich habe über wurde polier ...

+0

Sie können den Erstellungszeitstempel zu jedem Dataset hinzufügen und den aktuellen Zeitstempel als 'startAt'-Abfrage https://www.firebase.com/docs/ordered-data.html https://www.firebase.com/docs verwenden /javascript/query/startat.html – Prinzhorn

+0

Das würde gut mit der Art funktionieren, wie die Dinge derzeit strukturiert sind - der "Schlüssel" der Daten (in einem Schlüssel: val-Format) ist der Zeitstempel der Daten. Danke für die Information! – MandM

Antwort

5

alte Nachrichten löschen

Wenn Sie nicht an historischen Daten interessiert sind, dann verwenden Sie dies als Nachrichtenwarteschlange. Wenn dies der Fall ist, sollten alte Datensätze nach dem Lesen gelöscht (oder auf einem alternativen Pfad archiviert) werden. Auf diese Weise ist das Problem selbstauflösend.

Wenn Sie dieses Modell zu halten, ein paar gute Möglichkeiten stehen zur Verfügung:

Speicher der letzte Schlüssel lesen und verwenden, die als Ausgangspunkt der nächsten Last

Sie auch die Speicherung könnte Schlüssel in Firebase

var fb = new Firebase(URL); 
fb.child('last_read_key').once('value', function(lastReadSnap) { 
    var lastKey = lastReadSnap.val(); 
    var pri = lastReadSnap.getPriority(); 
    fb.child('data_to_read').startAt(pri, lastKey).on('child_added', function(snap) { 
     if(snap.name() !== lastKey) { 
     console.log('new record', snap.name()); 
     fb.child('last_read_key').setWithPriority(snap.name(), snap.getPriority()); 
     } 
    }); 
}); 

Verwenden Prioritäten Zeitstempel von alten Aufzeichnungen markieren

Beim Schreiben von Datensätzen, die Verwendung setWithPriority:

fb.child('records/$recordid').setWithPriority(data, Firebase.ServerValue.TIMESTAMP); 

Jetzt können Sie Aufzeichnungen ab "jetzt" lesen:

fb.child('records').startAt(Date.now()).on('child_added', function(snap) { 
    console.log('new child', snap.name()); 
}); 

Hinweis einer Einschränkung der Zeitstempel hier verwendet wird. Ich habe Date benutzt.now() im startAt() -Befehl, da Firebase.ServerValue.TIMESTAMP derzeit nicht unterstützt wird (Bug wurde dafür eingereicht).

Verwandte Themen