0

我正在学习AngularJS和Firebase,我正在玩一个简单的ChatApp,以了解代码。在Firebase规则中添加“.indexOn”:“.value”

我的火力地堡DB结构是这样的:

"chat": { 
    "messages": { 
     "chat1": { [ list of messages ] }, 
     "chat2": { [ list of messages ] } 
    }, 
    "rooms": { 
     "chat1": { 
      "users": { 
       "user1": true, 
       "user2": true 
      } 
     }, 
     "chat2": { 
      "users": { 
       "user2": true, 
       "user3": true 
      } 
     } 
    } 
} 

由于火力地堡的保护规则,我不能添加聊天链接的用户节点,比需要我必须做一个火力地堡查询检索聊天室用户,在App Start Up上使用orderByChild()查询。

使用火力地堡是简单的比我可以使用来获取所有聊天:

var chatLink = firebase.database().ref('chat/rooms'); 
chatLink 
    .orderByChild('users/' + userId) 
    .equalTo(true) 
    .once('value', function(chatSnap){ 

     /* Do Some Stuff Here */ 

    }); 

每一件事情的工作很好,但我收到的控制台的警告:

火力警告:使用未指定的索引。考虑加入“.indexOn”:‘用户/ {} userId的’于/聊天/间到您的安全规则,获得更好的性能

搜索在网络上,我发现,对于变量orderByChild()查询,我可以通过用户.indexOn: .value在我的Firebase规则。

我试图添加此规则:

{ 
    "rules": { 
     "chat": { 
      "rooms": { 
       ".indexOn": ".value" 
      } 
     } 
    } 
} 

但我仍然收到总是警告。我该如何解决它?

非常感谢!

回答

3

索引此结构,以便有效的查询,你必须添加一个索引为每个用户:

{ 
    "rules": { 
     "chat": { 
      "rooms": { 
       ".indexOn": ["users/user1", "users/user2"] 
      } 
     } 
    } 
} 

这不会是维护,因为你可能会添加用户动态。

像往常一样使用NoSQL数据库,这意味着您必须扩展/调整您的数据模型以允许使用您想要的用例。相反,查询他们的用户的房间,保持房间的每个用户列表(除了当前数据):

"user_rooms": { 
    "user1": { 
    "chat1": true 
    }, 
    "user2": { 
    "chat1": true, 
    "chat2": true 
    } 
    "user3": { 
    "chat2": true 
    } 

现在你可以看一下对用户的聊天室,甚至无需查询。

另请参阅我在Firebase query if child of child contains a value中有关此分类问题的回答。

+0

谢谢,但如何处理“.indexOn”:“.value”这样的规则?我读过我可以在变量查询中使用它,但似乎不适用于我的情况... –

+1

'.value'上的索引适用于'orderByValue '你的查询是'orderByChild'查询,所以它需要每个指定子的索引 –

0

我知道这可能迟了2点,但这里有些东西可以帮助你。我一直在寻找和你一样的信息,而在我的情况下,它让我感到很高兴。

$ usersId匹配任何子键。所以你必须做这样的事情。

{ 
"rules": { 
    "chat": { 
     "rooms": { 
      "users": { 
       "$usersId": { 
        ".indexOn": ".value" 
       } 
      } 
     } 
    } 
} 

我的情况: 使用未指定的索引。考虑添加'“。indexOn“: ”日“”在消息/ -L2bPVX4_fL41H7lhexc您的安全和火力地堡数据库规则获得更好的性能

L2bPVX4_fL41H7lhexc ==孩子在我的NoSQL数据库结构

解决方案:

"messages": { 
    "$messagesId": { 
    ".indexOn": "date" 
    } 
} 
+0

谢谢你的回复!稍后我会检查是否您的解决方案可能适用于我的数据库规则 –

+0

让我知道如果它帮助你:) –