如何仅从Firebase查询中获取部分数据集

时间:2019-01-17 18:00:54

标签: firebase firebase-realtime-database angularfire2 firebase-security-rules

我正在尝试在Firebase中创建Users数据库。

结构如下:

users: {
    uid: {
        username: exampleName
        email: exampleEmail
        personalInfo: examplePersonalInfo
    }
}

目前,我可以通过执行以下操作从查询中获取整个数据对象:

db.database.ref('users').orderByChild('username').equalTo('exampleName')
    .once('value').then(handler);

我想查询数据库以确保没有其他个人拥有该用户名,但是我遇到的问题是我获取了特定uid的所有数据。

我只需要用户名,并且想在以下位置建立规则:

 personalInfo: {
    ".read" = "$uid === auth.uid"
 }

但是

 username: {
     ".read" = true
 }

这是可能的,这里是否存在仅查询和接收用户名的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

当查询返回一个子节点时,该子节点将包含其下的所有内容。您无法进一步过滤孩子返回。实际上,使用安全规则,一旦您授予对特定子节点的客户端访问权限,客户端就可以隐式访问其中的一切。您不能拒绝访问已被授予访问权限的父节点的子节点。

如果需要通过仅选择必要的子级来限制结果集的大小,则必须将数据复制到仅包含此特定查询所需数据的结构中。这在nosql类型数据库中很常见。好处是读取速度更快,读取次数更小。缺点是存储量较大,您需要使重复项保持同步。