我正在研究AngularJS和Firebase,我正在玩一个简单的ChatApp,只是为了理解代码。
我的Firebase数据库结构如下:
"chat": {
"messages": {
"chat1": { [ list of messages ] },
"chat2": { [ list of messages ] }
},
"rooms": {
"chat1": {
"users": {
"user1": true,
"user2": true
}
},
"chat2": {
"users": {
"user2": true,
"user3": true
}
}
}
}
由于Firebase保护规则,我无法在用户节点中添加聊天链接,而是必须使用Firebase查询来检索用户的聊天室,在App Start Up上使用orderByChild()
查询。
使用Firebase比使用以下方法检索所有聊天更简单:
var chatLink = firebase.database().ref('chat/rooms');
chatLink
.orderByChild('users/' + userId)
.equalTo(true)
.once('value', function(chatSnap){
/* Do Some Stuff Here */
});
每件事都运作良好,但我在控制台收到警告:
FIREBASE警告:使用未指定的索引。考虑在/ chat / rooms中添加“.indexOn”:“users / {userId}”到您的安全规则以获得更好的性能
在网络上搜索,我发现对于变量orderByChild()
查询,我可以在我的Firebase规则中使用.indexOn: .value
。
我试图添加此规则:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ".value"
}
}
}
}
但我仍然会收到警告。我该如何解决?
非常感谢!
答案 0 :(得分:7)
要对此结构编制索引以允许有效查询,您必须为每个用户添加索引:
{
"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中有关此分类问题的答案。
答案 1 :(得分:7)
我知道这可能有点迟了2,但这可能会对你有所帮助。我正在寻找与你相同的信息,在我的情况下,它使我感到高兴。
$ usersId匹配任何子键。所以你必须做这样的事情。
{
"rules": {
"chat": {
"rooms": {
"users": {
"$usersId": {
".indexOn": ".value"
}
}
}
}
}
我的情况: 使用未指定的索引。考虑在消息/ -L2bPVX4_fL41H7lhexc上添加'“.indexOn”:“date”'到您的安全和Firebase数据库规则以获得更好的性能
我的NoSQL数据库结构中的L2bPVX4_fL41H7lhexc == child
溶液:
"messages": {
"$messagesId": {
".indexOn": "date"
}
}