Firebase / AngularFire - 同步数据时按日期时间获取最后一个对象键

时间:2016-09-11 16:52:09

标签: firebase firebase-realtime-database angularfire

我目前在Firebase DB中有以下数据结构:

-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

上述内容为聊天应用程序提供支持,其中myUsername下面的每个密钥代表用户发送的消息 - 消息的日期时间充当密钥名称。除了datetime对象下面的消息键之外,还有一个timestamp键 - 这是发送消息时的UNIX时间戳。

我的最终目标是获取用户发送的最后一条聊天消息。我不知道最后一条消息的日期时间,因此必须从myUsername对象中识别出来。我目前正在使用以下内容来执行此操作:

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

这将返回具有数组索引0处最旧消息的用户的整个消息历史记录。我只想要最后一条消息。我将运行此功能达数十次(我需要获取数十个用户发送的最后一条消息)所以我宁愿不为用户下载和同步整个消息历史记录,而只是最后一条消息。我还注意到$asArray()限制了返回到400的数组的大小 - 所以如果我有一个用户发送的消息超过400条,那么最新的消息将从返回的结果中截断。

有没有办法以有效的方式获取myUsername下的最新对象?

1 个答案:

答案 0 :(得分:0)

查看limitToFirst,在你的订单返回之后:

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

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

附注...通过时间戳存储它并不理想,因为如果两个用户同时发送消息,则不能保证它是唯一的。您的firebase数据将覆盖自己。更重要的是,你的密钥不包含毫秒,只需几秒钟。