Firebase indexOn 安全和规则不起作用

Firebase indexOn security & rules not working

我在 xcode 中遇到此错误:

使用未指定的索引。考虑将 ".indexOn": "members/rsenov" at /groups 添加到您的安全规则以获得更好的性能

这是我的 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 
})

您正在尝试在数组上添加索引,这在 Firebase 中是不可能的。

正如错误消息告诉您的那样(它非常准确),您需要为 members/rsenov 添加索引:

{
  "rules": {
    ".read": true,
    ".write": true,
    "groups": {
      "$group_id": {
        ".indexOn": "members/rsenov"
      }
    }
  }
}

但这意味着您需要为每个用户添加一个索引,这是非常低效的。这就是推荐反规范化的原因。

作为替代方案(我在 中推荐),您可以自己创建自定义索引,这个过程称为非规范化。

{
  "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

对于使用 JSQMessages / Firebase 收到类似安全警告的任何人,您可以使用它。

{
"rules": {
    ".read": true,
    ".write": true,
    "typingIndicator": {
    ".indexOn": ".value"
  }
}
}