Firebase规则来访问特定的孩子的价值

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" } 

但这个规则没有给我任何的成功。任何想法如何实现预期的结果?

+0

您是否尝试过使用查询? – gasho

+0

@gasho是的,使用查询我可以拉下整个分支,然后只保留我需要的。 但实际上我试图从firebase本身提取所需的数据,这样我就不必在我的应用程序端运行任何查询。 –

您正在尝试使用安全规则来过滤列表。这是不可能的,也是开发人员通过SQL背景进入Firebase的常见陷阱之一。我们通常称其为“规则不是过滤器”,你可以了解更多关于它:

解决方案几乎总是相同的:保留每个用户有权访问的帖子键的单独列表。

UserLists:{ 
    JohnUid: { 
    KJHBJJHB: true, 
    KhBHJZJjZ: true 
    }, 
    JaneUid: { 
    KhBHJBJjJ: true 
    } 
} 

这种类型的列表通常被称为索引,因为它包含对实际文章的引用。您还可以在Firebase documentation on structuring data中找到关于此结构的更多信息。