我在xcode中遇到此错误:
使用未指定的索引。考虑在/ groups中添加“.indexOn”:“members / rsenov”到您的安全规则以获得更好的性能
这是我的JSON数据结构:
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
},
"-KB48kVOz4yTfdE86Ub7" : {
"author" : "senovi",
"members" : {
"senovi" : true
},
"name" : "Asd"
}
},
"users" : {
"rsenov" : {
"email" : "rsenov",
"groups" : {
"-KB422VV21cPzpgi1wF1" : true,
"-KB423lni1Iptn2fGwi1" : true
},
"name" : "Ruben",
},
"senovi" : {
"email" : "senovi",
"groups" : {
"-KB48kVOz4yTfdE86Ub7" : true
},
"name" : "Rubén ",
}
}
}
这就是我迄今为止在我的安全规则中所做的:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members"
}
}
}
}
这是触发错误的代码:
DataService.dataService.GROUPS_REF.queryOrderedByChild("members/\(DataService.dataService.CURRENT_USER_ID)").queryEqualToValue(true).observeEventType(.Value, withBlock: { snapshot in
//some code
})
答案 0 :(得分:4)
您正尝试在阵列上添加索引,这在Firebase中是不可能的。
正如错误消息告诉您的那样(令人惊讶的准确),您需要为members/rsenov
添加索引:
{
"rules": {
".read": true,
".write": true,
"groups": {
"$group_id": {
".indexOn": "members/rsenov"
}
}
}
}
但这意味着你需要为每个用户添加一个索引,这是非常低效的。这就是推荐非规范化的原因。
作为替代方案(我在answer to your last question中推荐),您可以自己创建一个自定义索引,这个过程称为非规范化。
{
"groups" : {
"-KB422VV21cPzpgi1wF1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 1"
},
"-KB423lni1Iptn2fGwi1" : {
"author" : "rsenov",
"members" : {
"rsenov" : true
},
"name" : "Item 2"
}
},
"users": {
"rsenov": {
"groups": {
"-KB422VV21cPzpgi1wF1": true,
"-KB423lni1Iptn2fGwi1": true
}
}
}
}
使用此数据结构,您甚至无需查询即可查找用户组:
ref.childByAppendingPath("users/rsenov/groups")
.observeEventType(.Value, withBlock: { snapshot in
或者如果您想使用当前经过身份验证的用户:
ref.childByAppendingPath("users")
.childByAppendingPath(ref.authData.uid)
.childByAppendingPath("groups")
.observeEventType(.Value, withBlock: { snapshot in
答案 1 :(得分:1)
对于使用JSQMessages / Firebase获得类似安全警告的任何人,您都可以使用此功能。
{
"rules": {
".read": true,
".write": true,
"typingIndicator": {
".indexOn": ".value"
}
}
}