如何在子节点嵌套子键上创建索引?

时间:2019-04-26 19:51:51

标签: android performance firebase-realtime-database

让我们说说我当前的结构Firebase实时数据库:

{ 
chatRooms:{
  chat1:{
   participants:{
    user1-id:true,
    user2-id:true
   }
   participantsCount:2,
   lastTimeUpdated: {TIMESTAMP},
   chatRoomName:"A chatroom",
   maxParticipantsCount:10
   }
  }
users:{
  user1-id:{
   name:user1-name,
   email:user1-email
  }
  user2-id:{
   name:user2-name,
   email:user2-email
   }
 }
}

我需要显示包含特定用户的所有聊天室及其所有信息,现在我的解决方案是:

#userId is currently authenticated, firebase user.
ref.child("chats").orderByChild("/participants/"+userId).equalTo(true)

返回包含等于$ true的$ userId的聊天列表,以及显示给用户的其他信息。有没有可能更改此查询AND / OR数据库结构以支持最佳索引的方法?如果我想添加索引,它将类似于:

chatrooms:{
 participants:{
  indexOn:"user1-id","user2-id" 
# number of ids grows as participants increase
# Not only that, I will have to add one by one manually.
 }
}

如何添加索引,同时在Android中进行查询,以显示用户所属的所有聊天室及其信息?

1 个答案:

答案 0 :(得分:0)

  

AFAIK,我无法“遍历” Android中孩子的按键

要遍历Android中快照的子级,请执行以下操作:

for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
  System.out.println(childSnapshot.getKey());
}

文档中的相关部分:https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events


如果您要询问如何显示有关用户所在的每个聊天室的信息,将采用如下所示的客户端加入:

firebase.database().ref("userChatrooms").child(firebase.auth().currentUser.uid).once(function(roomsSnapshot) {
  roomsSnapshot.forEach(function(roomKey) {
    firebase.database().ref("chatrooms").child(roomKey.key).once(function(roomSnapshot) {
      console.log(roomSnapshot.child("name").val());
    })
  })
})

Firebase pipelines the nested requests开始,这种客户端加入的速度并没有大多数开发人员所期望的慢。