查询对firebase中另一个对象内的日期进行排序

时间:2018-06-08 03:30:15

标签: javascript angularjs firebase firebase-realtime-database

我在angularjs中开发聊天,我有聊天列表视图和聊天视图。

我正在尝试做的是整理我的聊天列表以使用Firebase和JS显示最新的聊天,我做了我的研究,但我发现所有问题他们直接作为一个孩子但在我的内部DB我的日期在'lastMessage'键内。我的日期格式如下。

date: 1528417493034

任何帮助都将受到高度赞赏

我的结构如下:

"Users": {
"nCsXbTl8CcXvoviuL5Tt7kiV6Bn1" : {
      "contacts" : {
        "VN9AFnn4uXgDfoir8DWHnw54zrJ3" : {
          "email" : "test@test.com",
          "lastMessage" : {
            "date" : 1528417493034,
            "senderId" : "VN9AFnn4uXgDfoir8DWHnw54zrJ3",
            "status" : "success",
            "text" : "Yes?",
            "type" : "text",
            "uid" : "1528417493034VN9AFnn4uXgDfoir8DWHnw54zrJ3"
          },
          "name" : "test"
        },
        "cHuR26YaSgbO7ahSVLg1XG5HYer2" : {
          "email" : "aaa@aaa.com",
          "lastMessage" : {
            "date" : 1528417068249,
            "senderId" : "cHuR26YaSgbO7ahSVLg1XG5HYer2",
            "status" : "success",
            "text" : "Trigeeeers?",
            "type" : "text",
            "uid" : "1528417068249cHuR26YaSgbO7ahSVLg1XG5HYer2"
          },
          "name" : "aaa"
        }
      }
}

我的聊天列表视图如下:

<div layout="row" class="main-chat-container" layout-wrap>
<div class="list-container" flex="30">
    <div class="chat-header">
        <p>Lista de Chats</p>
    </div>
    <div class="chats-list">
        <div class="chats-header">
            <p>Usuarios</p>
        </div>
        <div class="chats" ng-repeat="chat in chats">
            <div class="email-container" ng-click="setUserData(chat)" ng-class="styleData.email == chat.email ? 'new-background' : ''">
                <a>{{chat.email}}</a> <p ng-show="counter > 1">{{testData.number}}</p>
            </div>
        </div>
    </div>
</div>
<div class-"chat-container" flex="70">
    <ui-view></ui-view>
</div>

控制器如下

app.controller('chatController', function (currentAuth, $scope, $firebaseArray, $firebaseObject) {

$scope.chats = [];

$scope.getContactsList = function(){
    var listRef = firebase.database().ref('Users').child(currentAuth.uid).child('contacts');
    var test = firebase.database().ref('Users').child(currentAuth.uid).child('contacts');
    var listArray = $firebaseArray(listRef);
    var testArray = $firebaseArray(test);
    $scope.chats = listArray;

    console.log("TEST ARRAY IS ");
    console.log(testArray);



}

$scope.getContactsList();
});

1 个答案:

答案 0 :(得分:1)

要让用户联系上一封邮件的时间戳,您可以执行以下操作:

var userRef = firebase.database().ref('Users').child(currentAuth.uid)
var contactsQuery = userRef.child('contacts').orderByChild("lastMessage/date");

请注意,这会按时间顺序为您提供联系人,因此您必须在客户端中撤消结果。

或者,有些人在其数据库的单独属性中保留反转值,例如

    "VN9AFnn4uXgDfoir8DWHnw54zrJ3" : {
      "email" : "test@test.com",
      "lastMessage" : {
        "date" : 1528417493034,
        "invertedDate" : -1528417493034,
        "senderId" : "VN9AFnn4uXgDfoir8DWHnw54zrJ3",

由于此invertedDate值已被反转,因此对该属性进行排序会以反向时间顺序为您提供联系人,这样您就不必在客户端中撤消这些联系人。