javascript - 按时间倒序对 Firebase 实时数据库中的数据进行排序

标签 javascript firebase firebase-realtime-database

<分区>

我正在使用 firebase 进行实时聊天。但是现在我在数据排序方面遇到了问题,就像在网络 whatsapp 中一样,我们以我想要显示的方式在顶部显示了最新时间的用户。

enter image description here

这就是我在 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();
                            });
                       }
                });
        }); 
});

enter image description here

我想根据时间戳对数据进行排序,但结果我收到了第一条消息,但我想要最后一条消息,它是根据时间戳排序的

最佳答案

您需要将日期/时间存储为时间戳,即自 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

关于javascript - 按时间倒序对 Firebase 实时数据库中的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55866022/

相关文章:

javascript - 保持控制始终可见

firebase - 在从云 Firestore 数据库中检索主图像之前,如何在 CircleAvatar 中放置虚拟图像?

java - 我应该如何设置 Firebase 实时数据库中键值类型的 getter 和 setter?

javascript - 如何通过在Javascript对象中创建新属性来为不存在的属性设置值?

javascript,这个条件是什么意思?如果(显示 || 真){...}

javascript - 如何更改 `this` 关键字的行为

javascript - 如何使用字典从 python 中提取嵌套的 JSON 值?

node.js - Arangojs - Firebase 云功能 => 无法连接到我的数据库

javascript - 使用规则强制 Firebase 数据库中字段的用户 ID

javascript - 如何在 react 钩子(Hook)中创建可重用状态?