Javascript 按反时间顺序对Firebase实时数据库中的数据进行排序

Javascript 按反时间顺序对Firebase实时数据库中的数据进行排序,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用firebase进行实时聊天。但现在我面临着数据排序的问题,比如在web whatsapp中,我们让用户以我想要的方式在顶部显示最新时间 以下是我在firebase中保存数据的方式: var rootRef = firebase.database().ref(); var storesRef = rootRef.child('messages');

我正在使用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();
                            });
                       }
                });
        }); 
});
$(文档).ready(函数(){
var rootRef=firebase.database().ref().child(“用户”);
rootRef.on('value',函数(快照)
{
snapshot.forEach(函数(childSnapshot)
{
console.log(childSnapshot);
var name=childSnapshot.key;
var childData=childSnapshot.val();
//console.log(childData);
如果($('#'+名称).length){
返回;
}否则{
var rootRef=firebase.database().ref().child(“消息”).child(名称);
var html='';
var username=名称;
var userid=childData.id;
rootRef.limitToLast(1).orderByChild('timestamp').on('child_added',函数(快照)
{
var name=snapshot.key;
var childDatamsg=snapshot.val();
$('#'+用户名).remove();
//document.getElementById(用户名).remove();
$(“#users”).prepend(“”+username+“”+childDatamsg.time+“”+childDatamsg.message+'1');
//$(this.attr('data-id').remove();
});
}
});
}); 
});


我想根据时间戳对数据进行排序,但结果是我得到了第一条消息,但我想要根据时间戳排序的最后一条消息。您需要将日期/时间存储为时间戳,即自Unix纪元以来的时间,以毫秒为单位

您可以使用实时数据库,如下所示:

var messagesRef = firebase.database().ref(....);
messages.push({
  name: .....,
  ....
  timestamp: firebase.database.ServerValue.TIMESTAMP
});
var messagesRef = firebase.database().ref(....);
var nowTimestamp = (new Date().getTime()) * -1;
messages.push({
  name: .....,
  ....
  timestamp: nowTimestamp
});
但是,由于您希望使用“最新(消息)显示在顶部”(即按相反的时间顺序)对消息进行排序,因此需要存储时间戳的值乘以-1

为此,您不能使用
ServerValue.TIMESTAMP
,因为您不能对服务器在后端填充的该值进行任何数学运算。然后,您应该使用一些标准JavaScript,如下所示:

var messagesRef = firebase.database().ref(....);
messages.push({
  name: .....,
  ....
  timestamp: firebase.database.ServerValue.TIMESTAMP
});
var messagesRef = firebase.database().ref(....);
var nowTimestamp = (new Date().getTime()) * -1;
messages.push({
  name: .....,
  ....
  timestamp: nowTimestamp
});

然后,要在应用程序中以正确的顺序显示消息,您必须使用文档中解释的
orderByChild()
,如下所示:

var nowTimestamp=(new Date().getTime())*-1;这是-1556283437968,所以这个值将存储在数据库中,我必须使用这个值进行排序?@coder_B就是这样!嘿,非常感谢你,我能帮你!另一个备注:如文档()所述,“由
push()
生成的唯一键按当前时间排序,因此生成的项目列表将按时间顺序排序。”。但是,由于你想按相反的时间顺序排序,你需要按照anwser中的说明进行排序。嘿,我认为它不起作用,你能帮我吗?