在Firebase

时间:2018-01-13 17:25:36

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

我使用Firebase构建react-native聊天室功能。我想根据另一个集合中的lastMessage createdAt值对chatList进行排序。

以下是我当前结构聊天的示例结构:

{
   Chatrooms: {
      CHAT_ID_1: {
         messages: [...],
         metadata: {
            lastMessages: {
                createdAt: 1515857717832  //the time
            },
            users: [USER_ID_1, USER_ID_2]
         }
      },
      CHAT_ID_2: {
         messages: [...],
         metadata: {
            lastMessages: {
                createdAt: 1515857717834  //the time
            },
            users: [USER_ID_1, USER_ID_3]
         }
      }
   },
   Users: {
      USER_ID_1: {
         chatList: {
            USER_ID_3: CHAT_ID_2,     
            USER_ID_2: CHAT_ID_1,
         }
      }
   }
}

由于CHAT_ID_2具有最新创建的lastMessage,因此它应该是USER_ID_1的chatList中的第一个。

我想知道如何对此进行排序。

1 个答案:

答案 0 :(得分:0)

从我看到的情况来看,无法通过上次更新时间戳来查找特定用户的聊天室。

我可以很快想到的解决方案:

  1. 使用单独的呼叫为用户所在的每个房间加载上次更新时间戳,然后在客户端订购。
  2. 为每个用户存储每个聊天室的上次更新时间戳,然后进行查询。
  3. 我希望第一个解决方案是不言自明的。虽然它确实需要一些额外的代码,但它实际上比大多数开发人员认为的更有效,因为calls from the client to the database are pipelined over the same connection

    第二种解决方案是向/Users/$uid/$chatroomid添加其他数据以适合您的用例。例如:

    Users: {
      USER_ID_1: {
         chatList: {
            CHAT_ID_2: 1515857717834
            CHAT_ID_1: 1515857717832
         }
      }
    }
    

    使用此结构,您可以按照最新更新的顺序进行聊天:

    firebase.database().ref("Users/USER_ID_1/chatList").orderByValue()
    

    但在这种情况下,我会自己选择选项1。由于每个用户的聊天室数量可能相当小,而且负载不需要查询,因此可能会很好地执行和扩展。