将 ".indexOn": ".value" 添加到 Firebase 规则中
Adding and ".indexOn": ".value" into Firebase Rules
我正在研究 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 保护规则,我无法在用户节点中添加聊天 link,因此我必须使用 orderByChild()
查询来执行 Firebase 查询以检索用户的聊天室应用启动。
使用 Firebase 很简单,我可以使用以下方法检索所有聊天:
var chatLink = firebase.database().ref('chat/rooms');
chatLink
.orderByChild('users/' + userId)
.equalTo(true)
.once('value', function(chatSnap){
/* Do Some Stuff Here */
});
一切正常,但我在控制台收到警告:
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "users/{userId}" at /chat/rooms to your security rules for better performance
在网络上搜索,我发现对于变量 orderByChild()
查询,我可以在我的 Firebase 规则中使用 .indexOn: .value
。
我尝试添加这条规则:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ".value"
}
}
}
}
但我仍然总是收到那个警告。我该如何解决?
非常感谢!
要索引此结构以允许高效查询,您必须为每个用户添加一个索引:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ["users/user1", "users/user2"]
}
}
}
}
这将无法维护,因为您可能会动态添加用户。
与 NoSQL 数据库一样,这意味着您必须 expand/adapt 您的数据模型以允许您想要的用例。不要为他们的用户查询房间,而是为每个用户保留一个房间列表(除了您当前的数据):
"user_rooms": {
"user1": {
"chat1": true
},
"user2": {
"chat1": true,
"chat2": true
}
"user3": {
"chat2": true
}
现在您无需查询就可以查找某个用户的聊天室。
另请参阅我在 中关于此分类问题的回答。
我知道这可能有点太晚了,但这里有一些东西可能会对你有所帮助。我一直在寻找与您相同的信息,就我而言,它对我有所帮助。
$usersId
匹配任何子键。所以你必须做这样的事情。
{
"rules": {
"chat": {
"rooms": {
"users": {
"$usersId": {
".indexOn": ".value"
}
}
}
}
}
我的情况:
使用未指定的索引。考虑将 ".indexOn": "date"
at messages/-L2bPVX4_fL41H7lhexc
添加到您的安全和 Firebase 数据库规则以获得更好的性能:
L2bPVX4_fL41H7lhexc == child
在我的 NoSQL 数据库结构中
解决方案:
"messages": {
"$messagesId": {
".indexOn": "date"
}
}
我正在研究 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 保护规则,我无法在用户节点中添加聊天 link,因此我必须使用 orderByChild()
查询来执行 Firebase 查询以检索用户的聊天室应用启动。
使用 Firebase 很简单,我可以使用以下方法检索所有聊天:
var chatLink = firebase.database().ref('chat/rooms');
chatLink
.orderByChild('users/' + userId)
.equalTo(true)
.once('value', function(chatSnap){
/* Do Some Stuff Here */
});
一切正常,但我在控制台收到警告:
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "users/{userId}" at /chat/rooms to your security rules for better performance
在网络上搜索,我发现对于变量 orderByChild()
查询,我可以在我的 Firebase 规则中使用 .indexOn: .value
。
我尝试添加这条规则:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ".value"
}
}
}
}
但我仍然总是收到那个警告。我该如何解决?
非常感谢!
要索引此结构以允许高效查询,您必须为每个用户添加一个索引:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ["users/user1", "users/user2"]
}
}
}
}
这将无法维护,因为您可能会动态添加用户。
与 NoSQL 数据库一样,这意味着您必须 expand/adapt 您的数据模型以允许您想要的用例。不要为他们的用户查询房间,而是为每个用户保留一个房间列表(除了您当前的数据):
"user_rooms": {
"user1": {
"chat1": true
},
"user2": {
"chat1": true,
"chat2": true
}
"user3": {
"chat2": true
}
现在您无需查询就可以查找某个用户的聊天室。
另请参阅我在
我知道这可能有点太晚了,但这里有一些东西可能会对你有所帮助。我一直在寻找与您相同的信息,就我而言,它对我有所帮助。
$usersId
匹配任何子键。所以你必须做这样的事情。
{
"rules": {
"chat": {
"rooms": {
"users": {
"$usersId": {
".indexOn": ".value"
}
}
}
}
}
我的情况:
使用未指定的索引。考虑将 ".indexOn": "date"
at messages/-L2bPVX4_fL41H7lhexc
添加到您的安全和 Firebase 数据库规则以获得更好的性能:
L2bPVX4_fL41H7lhexc == child
在我的 NoSQL 数据库结构中
解决方案:
"messages": {
"$messagesId": {
".indexOn": "date"
}
}