我正在使用Firebase进行实时聊天。但是现在我在数据排序中遇到了问题,例如在Web whatsapp中,我们使用户以我想显示的方式以最新的时间显示最新时间。
这是我将数据保存在Firebase中的方法:
var rootRef = firebase.database().ref();
var storesRef = rootRef.child('messages');
var adminref = storesRef.child(username);
var newStoreRef = adminref.push();
newStoreRef.set({
"file": "",
"id": senderid,
"message": chatdata,
"time": chattime,
"timestamp" : nowTimestamp,
"name": senderName
});
然后我就这样检索数据
$(document).ready(function(){
var rootRef = firebase.database().ref().child("users");
rootRef.on('value', function(snapshot)
{
snapshot.forEach(function(childSnapshot)
{
console.log(childSnapshot);
var name = childSnapshot.key;
var childData = childSnapshot.val();
//console.log(childData);
if($('#'+name).length) {
return;
} else {
var rootRef = firebase.database().ref().child("messages").child(name);
var html = '';
var username = name ;
var userid = childData.id;
rootRef.limitToLast(1).orderByChild('timestamp').on('child_added', function(snapshot)
{
var name = snapshot.key;
var childDatamsg = snapshot.val();
$('#'+username).remove();
//document.getElementById(username).remove();
$("#users").prepend('<div class="row sideBar-body userchat" data-id="'+userid+'" onclick="showDiv()" id="'+username+'"><div class="col-sm-3 col-xs-3 sideBar-avatar"><div class="avatar-icon"><img src="http://chat.synetal.com/assets/user2.jpg"></div></div><div class="col-sm-9 col-xs-9 sideBar-main"><div class="row"><div class="col-sm-8 col-xs-8 sideBar-name-align" id="chat"><span class="name-meta">'+ username +'</span></div><div class="col-sm-4 col-xs-4 pull-right sideBar-time-align"><span class="time-meta pull-right">'+childDatamsg.time+'</span></div><div class="col-sm-10 col-xs-10 sideBar-message-align"><span class="sideBar-last-msg">'+childDatamsg.message+'</span></div><div class="col-sm-2 col-xs-2 pull-right sideBar-time-align"><span class="sideBar-msg-counter pull-right" style="">1</span></div></div></div></div>');
// $(this).attr('data-id').remove();
});
}
});
});
});
我想对时间戳中的数据进行排序,但结果是我收到了第一条消息,但我希望最后一条消息按照时间戳进行排序
答案 0 :(得分:1)
您需要将日期/时间存储为时间戳,即自Unix时代以来的时间(以毫秒为单位)。
通过实时数据库,您可以使用ServerValue.TIMESTAMP
,如下所示:
var messagesRef = firebase.database().ref(....);
messages.push({
name: .....,
....
timestamp: firebase.database.ServerValue.TIMESTAMP
});
但是,由于您要使用“最新(顶部)显示的消息(按时间倒序)”对消息进行排序,因此需要存储时间戳值乘以-1
为此,您不能使用ServerValue.TIMESTAMP
,因为您不能对服务器在后端填充的该值进行任何数学运算。然后,您应该使用一些标准的JavaScript,如下所示:
var messagesRef = firebase.database().ref(....);
var nowTimestamp = (new Date().getTime()) * -1;
messages.push({
name: .....,
....
timestamp: nowTimestamp
});
然后,要在您的应用中以正确的顺序显示消息,您必须按照文档中的说明使用orderByChild()
,在这里:https://firebase.google.com/docs/database/web/lists-of-data#sort_data