Firebase-在具有双向关系的平坦数据中进行查询

Firebase-在具有双向关系的平坦数据中进行查询,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我目前有一个Firebase数据库,其结构如下 // Tracking two-way relationships between users and groups { " users": { "mchen": { "name": "Mary Chen", "groups": { "alpha": true, "charlie": true } }, ...

我目前有一个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  
     }  
   },  
   ...  
 }
}

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

我认为单次查询不可能做到这一点,而且不支持多个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.
这可能是解决你问题的一种方法,但你最初会下载米奇可能不在其中的群组。这可能不是你想要的(安全等)

如果您希望只获取它们都是显式的组,而不进行任何客户端筛选,那么您必须将数据库重组为类似这样的结构

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

您的查询看起来类似,从组中添加/删除用户将更加复杂。您必须确保每个可能的对都在groupName下。你可以通过设置一个标准来减少配对的数量,例如:Donald在Mickey之前,因为D在M之前,或者诸如此类的东西。

你试过什么了吗?