Firebase - 使用双向关系查询展平数据

时间:2017-02-11 16:32:11

标签: firebase firebase-realtime-database

我目前有一个具有以下结构的Firebase数据库

// Tracking two-way relationships between users and groups     {  
 " users": {  
   "mchen": {  
     "name": "Mary Chen",  
     "groups": {       
        "alpha": true,  
        "charlie": true  
     }  
   },  
   ...  
 },      "groups": {  
   "alpha": {  
     "name": "Alpha Group",  
     "members": {  
       "mchen": true,  
       "donald": true  
     }  
 },   "bravo": {  
   "name": "Bravo Group",  
     "members": {  
       "mickey": true,  
       "donald": true  
     }  
   },  
   ...  
 }
}

如何编写查询以向我显示给定用户组共有的所有组。即告诉我米奇和唐纳德都注册的所有团体。

1 个答案:

答案 0 :(得分:0)

我认为单个查询无法实现,并且不支持多个equalTo。

我会重构你的数据库

root
L users
L groups
  L groupName
    L ...
L groupMembers
  L groupName
    L userName:true

然后查询

  

查询是reference.child(' groupMembers')。orderByChild(' Donald')。equalTo(true);

然后浏览结果

List resultList
for all DataSnapshot's as snapshot in dataSnapshot's Children
  if snapshot.child('Mickey') is not null
    add to resultList key of snapshot


// resultList now contains all group keys/names which Donald and Mickey are both appart of.

这将是解决问题的一种方法,但你最初会下载米奇可能不会分开的群组。这可能是也可能不是你想要的(安全等等。)。

如果你只想获得他们都是appart的组而没有任何客户端过滤,你必须将你的数据库重组为这样的。

root
L users ...
L groups ...
L groupPairs
  L groupName
    L DonaldMickey:true

您的查询看起来很相似,在群组中添加/删除用户会更精细。您必须确保每个可能的对都在groupName下。您可以通过设置一个标准来减少对的数量,例如:在米奇之前的唐纳德,因为D在M之前,或类似的东西。