如果您想在节点中保存多个相同类型的子节点,childByAutoId
会很有用,这样每个子节点都有自己唯一的标识符。
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
&amp; List-3
)并忽略其他子值。
我是否必须在我的应用程序中执行此操作,还是可以通过Firebase安全规则实现此目的?
我目前的规则定义是:
"List":{
".read": "root.child('List/'+root.child('List').val()+'/user_id').val() === auth.uid" }
但这条规则并没有给我任何成功。知道如何达到预期效果吗?
答案 0 :(得分:1)
您正在尝试使用安全规则来过滤列表。这是不可能的,也是开发人员从SQL背景到Firebase的常见陷阱之一。我们通常将其称为“规则不是过滤器”,您可以在以下方面了解更多信息:
解决方案几乎总是一样的:保留每个用户有权访问的帖子的单独列表。
UserLists:{
JohnUid: {
KJHBJJHB: true,
KhBHJZJjZ: true
},
JaneUid: {
KhBHJBJjJ: true
}
}
这种类型的列表通常被称为索引,因为它包含对实际帖子的引用。您还可以在Firebase documentation on structuring data。
中找到有关此结构的更多信息