如何获取其数组包含特定值的子节点

我有一个与文档基本相同的数据库方案:

// 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 ,它可以让所有参与特定组的用户(例如“group”包含“techpionneers”的用户)

我该怎么办? 我尝试了一个Database.database().reference(withPath: "users").queryOrdered(byChild: "groups").queryEqual(toValue: "techpioneers")但是这样做(很明显)。

Franks解决方案很有用,但另一种方法是使用深度查询,即按深度路径排序,以查询用户节点以查找符合条件的子节点。 这是格式

  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 } } 

要加载属于特定组的所有用户,请 /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 。