我正在尝试在Firebase中创建用户数据库。
结构如下:
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
}
这是否可能,这里是否有仅查询和接收用户名的解决方案?
谢谢!
当查询返回子节点时,该子节点将包含其下的所有内容。 您无法进一步筛选要返回的子项。 事实上,使用安全规则,一旦您向特定子节点授予对客户端的访问权限,客户端就可以隐式访问其下的所有内容。 您不能拒绝对已授予访问权限的父节点的子节点的访问。
如果需要通过仅选择必要的子项来限制结果集的大小,则必须将数据复制到仅包含此特定查询所需数据的结构中。 这在nosql类型的数据库中很常见。 好处是读取速度更快、更小。 缺点是存储空间较大,您需要保持重复项同步。