2017-08-07 52 views
0

我有一个数据库方案,它在本质上是相同的是,一个是documentation如何获得孩子的,其阵列中含有一定值

// An index to track Ada's memberships 
{ 
    "users": { 
    "alovelace": { 
     "name": "Ada Lovelace", 
     // Index Ada's groups in her profile 
     "groups": { 
     // the value here doesn't matter, just that the key exists 
     "techpioneers": true, 
     "womentechmakers": true 
     } 
    }, 
    ... 
    }, 
    "groups": { 
    "techpioneers": { 
     "name": "Historical Tech Pioneers", 
     "members": { 
     "alovelace": true, 
     "ghopper": true, 
     "eclarke": true 
     } 
    }, 
    ... 
    } 
} 

我想创建一个DatabaseQuery即得到所有用户参加特定组(例如,其“组”包含“techpionneers”的用户)

我应该如何继续?我尝试了Database.database().reference(withPath: "users").queryOrdered(byChild: "groups").queryEqual(toValue: "techpioneers"),但这并不奏效(显然)。

回答

1

弗兰克斯解决方案是现货,但替代方案是使用Deep Query,即按深度路径排序,以查询用户节点是否符合条件的子节点。这里的格式

let ref = self.ref.child("users") 
    let query = ref.queryOrdered(byChild: "groups/techpioneers").queryEqual(toValue: true) 
    query.observeSingleEvent(of: .value, with: { (snapshot) in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      print(snap) 
     } 
    }) 

结果是所有可在techpioneers组

"alovelace": { 
    "name": "Ada Lovelace", 
    "groups": { 
     "techpioneers": true, 
     "womentechmakers": true 
     } 
} 
+0

这是一个很好的答案,这样我就不必做两个查询的一部分用户。谢谢 –

3

,以便加载特定组的所有用户,开始/groups节点找到自己的关键:

ref.child("groups/techpioneers/members").observeSingleEvent(of: .value, with: { (snapshot) in 

这就给了你所有成员的钥匙。然后循环这些键并加载相应的用户。

这实质上是一个客户端连接操作。尽管您最初可能认为这非常慢,但实际上并非如此糟糕,因为Firebase通过单个连接管理请求。见http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786

相关问题