Firebase indexOn唯一键中的规则

时间:2017-02-21 17:12:42

标签: javascript firebase firebase-realtime-database firebase-security

我无法通过firebase数据库规则索引数据。

我的数据如下:

entities
 $entity_id
  users
   $user_id : true

我的firebase 3.x查询如下:

firebase.database().ref('entities')
  .orderByChild('users/' + user.uid)
  .equalTo(true)
  .once('value')

我的规则如下:

{ 
  "entities": {
    "users": {
      "$userId": {
        ".indexOn": ".value"
      }
    }
  }
}

但我还是得到了这个:

FIREBASE WARNING:
Using an unspecified index.
Consider adding ".indexOn": "users/VShAzNsxGjOIIlcrrZsWCxuMuuH2"
at /entities to your security rules for better performance

我试过了:

Firebase Security Rules: .indexOn unique ids

Firebase .indexOn dynamic keys

谢谢你的帮助

3 个答案:

答案 0 :(得分:0)

.indexOn应与动态键平行放置,如下所示:

{ 
  "entities": {
    "users": {
      ".indexOn": ".value",
    }
  }
}

答案 1 :(得分:-1)

解决方法是更好的noSQL架构。

该查询将尝试过滤所有实体并检查是否找到userId。

实际上,您必须拥有像userEntities这样的引用,其中包含此用户所属的所有实体密钥 - 并通过这些密钥获取此用户实体。

您必须注意的一件事是,为firebase设计数据库是sequrity规则。 Sequrity规则最终决定这种类型的查询在客户端是否可以接受。 例如:

  

firebase.database()。ref('entities')。orderByChild('users /'+ user.uid)

是对“实体”根的调用,而不是对“entities / users / userId”的单独调用。因此,如果您想禁用所有其他实体的读取,但您必须尝试访问

  

.REF( '实体')。子(ENTITYID)

这是一个在任何地方都没有突出显示的事情。

关系数据库赢得了这一个IMO。

答案 2 :(得分:-3)

删除任何.indexOn属性。

键会自动编入索引,因此无需明确指定。

https://firebase.google.com/docs/database/security/indexing-data