firebase使用orderByChild对孩子的孩子的价值

时间:2018-01-22 17:01:31

标签: javascript firebase react-native firebase-realtime-database

我正在使用react-native构建应用程序。我想按chatList值按降序排序createdAt

这是我的结构:

{
   "chatList": {
       "L3RDhCUvTVBk--KKgCl" : {
           "lastMessage": {
               "createdAt": 1516638900725
           }
       },
       "L3RDhCUvTVBk--KKgC1" : {
           "lastMessage": {
               "createdAt": 1516638920725
           }
       }
   }
}

另外,我是否需要索引此结构?

1 个答案:

答案 0 :(得分:1)

如果您的上一条消息始终位于聊天下的lastMessage/createdAt,(例如/chatList/*/lastMessage/createdAt),那么您可以通过以下方式查询聊天列表:

firebase.database.reference("chatList").orderByChild("lastMessage/createdAt")

但是你不能按降序排列。因此,您要么必须在客户端中反转结果,要么存储倒置的时间戳。有关详情,请参阅我的回答:firebase -> date order reverse

如果lastMessage实际上是动态的(chatList下的每个孩子都不同),那么很遗憾,您无法从当前结构中获取结果,并且您需要将数据扩充到允许查询。

如果您想获得按其上次更新日期排序的聊天列表,那么您需要在数据库中准确存储该聊天:聊天列表及其上次更新日期。

{
  "chatUpdates": {
    "L3RDhCUvTVBk--KKgCl": 1516638900725
    "L3RDhCUvTVBk--KKgC1": 1516638920725
  }
}

这是一个附加数据结构,纯粹是为了允许您的用例。现在,您需要在添加邮件时同时更新chatListchatUpdates。要详细了解有效的方法,请参阅How to write denormalized data in Firebase

一些相关问题: