2016-09-11 2 views
0

Ich habe derzeit folgende Datenstruktur in meiner Firebase DB:Firebase/AngularFire - Get Last Objektschlüssel von für Datum und Uhrzeit Wenn die Datensynchronisation

-myUsername 
    -5-31-2016 10:30:24 PM 
     -message: 'first message' 
     -timestamp: 1464748224 
    -5-31-2016 10:34:26 PM 
     -message: 'second message' 
     -timestamp: 1464748466 
    -5-31-2016 10:55:01 PM 
     -message: 'third message' 
     -timestamp: 1464749701 

Die oben treibt eine Chat-Anwendung, bei der jede Taste unter myUsername eine Nachricht darstellt, die Der Benutzer hat gesendet - mit der Datumszeit der Nachricht, die als Schlüsselname fungiert. Zusätzlich zu dem Nachrichtenschlüssel unterhalb des datetime -Objekts gibt es auch einen timestamp-Schlüssel - dies ist der UNIX-Zeitstempel, zu dem die Nachricht gesendet wurde.

Mein Endziel ist es, die letzte Chat-Nachricht von einem Benutzer gesendet zu bekommen. Ich kenne die Datetime dieser letzten Nachricht nicht, so dass sie aus dem Objekt myUsername erkannt werden muss. Ich bin derzeit die folgende tun:

$scope.getUsernameLastMessage = function(userName){ 
    var ref = new Firebase(firebaseConstants.url + 'messages/' + username); 
    $scope.authWithFirebase(ref); 
    var sync = $firebase(ref.orderByChild('timestamp')); 
    return sync.$asArray(); 
}; 

Dies wird die gesamte Nachricht Geschichte eines Benutzer mit der ältesten Nachricht an Array-Index 0 zurück Ich möchte nur die letzte Nachricht. Ich werde diese Funktion bis zu Dutzende Male ausführen (ich muss die letzte Nachricht von Dutzenden von Benutzern erhalten), also möchte ich nicht den gesamten Nachrichtenverlauf für einen Benutzer herunterladen und synchronisieren, sondern nur die letzte Nachricht. Ich habe auch festgestellt, dass $asArray() die Größe des zurückgegebenen Arrays auf 400 begrenzt - wenn ich also einen Benutzer mit mehr als 400 Nachrichten gesendet habe, werden die neuesten Nachrichten von den zurückgegebenen Ergebnissen abgeschnitten.

Gibt es eine Möglichkeit, das neueste Objekt unter myUsername effizient zu erhalten?

Antwort

0

Blick in limitToFirst, nach dem orderBy nur haben sie eine Rückkehr:

...ref.orderByChild('timestamp').limitToLast(1) 

https://firebase.google.com/docs/reference/js/firebase.database.Query#limitToFirst

Exkurs ... Speicherung durch Zeitstempel nicht ideal, da das nicht garantiert eindeutig ist wenn zwei Benutzer gleichzeitig eine Nachricht senden. Ihre Firebase-Daten würden sich selbst überschreiben. Mehr noch, dass Ihr Schlüssel keine Millisekunden, sondern nur Sekunden enthält.

+0

Ich konnte 'orderByChild ('- timestamp')' nicht funktionieren (absteigend sortieren), also habe ich 'limitToLast (1)' beendet, aber das brachte mich in die richtige Richtung –

+0

Genau! Es ist lexographisch gemacht, also sollte ich limitToLast setzen, um meine Antwort zu aktualisieren. –