在Firebase数据库中查找对象
问题描述:
对不起Firebase的新手。这里是我的示例数据库。在Firebase数据库中查找对象
{
groups:{
#groupid:{
members:{
#userid:
}
name:
}
}
}
我试图找到用户的组。我能够得到的数据,当我和组名搜索:
let lRef = FIRDatabase.database().referenceWithPath("groups")
lRef.queryOrderedByChild("name").queryEqualToValue("one").observeSingleEventOfType(.Value, withBlock: { snapshot in
print("hello world \(snapshot.value)")
})
但我不能够得到,当我与会员用户名搜索。有人请帮我完成这件事。
答
这是一个嵌套数据的完美例子。
Google对此主题提供了很好的documentation。他们建议避免这种情况。
这里引用:
避免嵌套数据
因为火力地堡实时数据库允许嵌套数据32层深,你也许会认为这应该是默认的结构体。但是,当您在数据库中某个位置获取数据时,还可以检索其所有子节点。另外,当您授予某人读取或写入数据库中某个节点的访问权限时,您还授予他们访问该节点下的所有数据的权限。因此,在实践中,最好保持数据结构尽可能平坦。
你可能会在你的数据库中有用户元数据的另一个节点。该用户节点应该有一个包含用户所在组的孩子。这样,您很容易就能看到用户在哪个组中。
如果我是正确的,这正是你正在努力实现。
您的数据库会/应该是这个样子:
{
groups: {
#groupid01: {
members: {
#userid: true,
}
name: #groupname01
},
#groupid02: {
members: {
}
name: #groupname02
}
},
users: {
#userid01: {
groups: {
#groupid01: true,
#groupid02: true
}
},
#userid02: {
groups: {
}
},
...: {},
}
}
希望这有助于!
我不立即明白为什么查询不起作用,所以希望别人发现它。但是您肯定会嵌套不同类型的数据,这是Firebase建议的。我建议创建两个*节点'/ groups/$ groupid'和'/ members/$ groupid',然后拆分它们之间相同的数据。它不会解决你的查询问题,但它会阻止许多未来的麻烦。 –