我目前在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
下的最新对象?
答案 0 :(得分:0)
查看limitToFirst,在你的订单返回之后:
...ref.orderByChild('timestamp').limitToLast(1)
https://firebase.google.com/docs/reference/js/firebase.database.Query#limitToFirst
附注...通过时间戳存储它并不理想,因为如果两个用户同时发送消息,则不能保证它是唯一的。您的firebase数据将覆盖自己。更重要的是,你的密钥不包含毫秒,只需几秒钟。