Firebase规则来访问特定的孩子的价值
问题描述:
如果你想保存在一个节点的多个相同类型的孩子,那么每个孩子将有自己的唯一标识符childByAutoId
将是有用的。Firebase规则来访问特定的孩子的价值
List:{
KJHBJJHB:{
name:List-1,
owner:John Doe,
user_id:<Fire base generated User_id>
},
KhBHJBJjJ:{
name:List-2,
owner:Jane Lannister,
user_id:<Fire base generated User_id>
},
KhBHJZJjZ:{
name:List-3,
owner:John Doe,
user_id:<Fire base generated User_id>
}
}
我想用下面的代码的帮助来访问List
:
let ref = FIRDatabase.database().reference(withPath: "/List")
当前用户登录到应用程序是John Doe
。当用户访问列表时,我想要所有List
孩子的主人是John Doe
(即List-1
& List-3
),并忽略其他子值。
我是否必须在我的应用程序中执行此操作,或者可以通过Firebase安全规则来实现吗?
我现在的规则定义是:
"List":{
".read": "root.child('List/'+root.child('List').val()+'/user_id').val() === auth.uid" }
但这个规则没有给我任何的成功。任何想法如何实现预期的结果?
答
您正在尝试使用安全规则来过滤列表。这是不可能的,也是开发人员通过SQL背景进入Firebase的常见陷阱之一。我们通常称其为“规则不是过滤器”,你可以了解更多关于它:
- 的Firebase documentation
- 这answer
- 我们的新的视频系列Firebase for SQL developers
- 和许多previous questions mentioning "rules are not filters"
解决方案几乎总是相同的:保留每个用户有权访问的帖子键的单独列表。
UserLists:{
JohnUid: {
KJHBJJHB: true,
KhBHJZJjZ: true
},
JaneUid: {
KhBHJBJjJ: true
}
}
这种类型的列表通常被称为索引,因为它包含对实际文章的引用。您还可以在Firebase documentation on structuring data中找到关于此结构的更多信息。
您是否尝试过使用查询? – gasho
@gasho是的,使用查询我可以拉下整个分支,然后只保留我需要的。 但实际上我试图从firebase本身提取所需的数据,这样我就不必在我的应用程序端运行任何查询。 –