在Firebase数据库中查找对象

问题描述:

对不起Firebase的新手。这里是我的示例数据库。在Firebase数据库中查找对象

{ 
    groups:{ 
    #groupid:{ 
     members:{ 
     #userid: 
     } 
     name: 
    } 
    } 
} 

enter image description here

我试图找到用户的组。我能够得到的数据,当我和组名搜索:

let lRef = FIRDatabase.database().referenceWithPath("groups") 
    lRef.queryOrderedByChild("name").queryEqualToValue("one").observeSingleEventOfType(.Value, withBlock: { snapshot in 
     print("hello world \(snapshot.value)") 
    }) 

但我不能够得到,当我与会员用户名搜索。有人请帮我完成这件事。

+0

我不立即明白为什么查询不起作用,所以希望别人发现它。但是您肯定会嵌套不同类型的数据,这是Firebase建议的。我建议创建两个*节点'/ groups/$ groupid'和'/ members/$ groupid',然后拆分它们之间相同的数据。它不会解决你的查询问题,但它会阻止许多未来的麻烦。 –

这是一个嵌套数据的完美例子。

Google对此主题提供了很好的documentation。他们建议避免这种情况。

这里引用:

避免嵌套数据

因为火力地堡实时数据库允许嵌套数据32层深,你也许会认为这应该是默认的结构体。但是,当您在数据库中某个位置获取数据时,还可以检索其所有子节点。另外,当您授予某人读取或写入数据库中某个节点的访问权限时,您还授予他们访问该节点下的所有数据的权限。因此,在实践中,最好保持数据结构尽可能平坦。

你可能会在你的数据库中有用户元数据的另一个节点。该用户节点应该有一个包含用户所在组的孩子。这样,您很容易就能看到用户在哪个组中。

如果我是正确的,这正是你正在努力实现。

您的数据库会/应该是这个样子:

{ 
    groups: { 
    #groupid01: { 
     members: { 
     #userid: true, 
     } 
     name: #groupname01 
    }, 
    #groupid02: { 
     members: { 
     } 
     name: #groupname02 
    } 
    }, 
    users: { 
    #userid01: { 
     groups: { 
     #groupid01: true, 
     #groupid02: true 
     } 
    }, 
    #userid02: { 
     groups: { 
     } 
    }, 
    ...: {}, 
    } 
} 

希望这有助于!