如何检查一个特定的值(UID)的firebase子节点?

我正在尝试查询Firebase以检查当前用户的uid是否列在房间的“参与者”中。 如果是这样,我抓住那个房间的信息。

以下是我目前的观察者,该应用程序倾听应用程序中的所有房间,而不仅仅是用户参与的房间。 但是我需要先进行检查,看看当前用户的UID列在哪个房间; 如果有匹配(uid在房间的参与者中),那么获取该房间的数据:

private func observeRooms() { guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return} roomRefHandle = roomRef.observe(.childAdded, with: { (snapshot) -> Void in let roomData = snapshot.value as! Dictionary<String, AnyObject> let id = snapshot.key guard let name = roomData["roomName"] as! String! else {print("Error getting user name"); return} self.usersRooms.append(Room(id: id, name: name, participants: [uid])) self.tableView.reloadData() }) } 

这就是房间在数据库中的结构:

 "rooms" : { "-Ki6TJWO-2R1L4SyhSqn" : { "messages" : { "-Ki6TWrXxWqjaRJAbyVt" : { "senderId" : "tzfHgGKWLEPzPU9GvkO4XE1QKy53", "senderName" : "Timothy", "text" : "Room One message" } }, "participants" : { "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true }, "roomName" : "Room One" }, "-Ki6TKOnmToeUuBzrnbb" : { "participants" : { "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true }, "roomName" : "Room Two" }, "-Ki6TLGC1Encm1v-CbHB" : { "participants" : { "tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true }, "roomName" : "Room Three" } } 

我怎么能改变我的function,以便它首先检查所有房间的参与者当前用户的uid,然后抓取值?

感谢您的任何build议!

编辑:周杰伦的方法:

 private func observeRooms() { guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return} let queryRef = roomRef.queryOrdered(byChild: "participants/\(uid)").queryEqual(toValue: true) queryRef.observe(.childAdded, with: { snapshot in let roomDict = snapshot.value as! [String: AnyObject] let id = snapshot.key let roomName = roomDict["roomName"] as! String let participants = roomDict["participants"] as! [String: AnyObject] let numberOfParticipants = participants.count print("\nRoom Name: \(roomName)") print("Participants: \(participants)") print("Room ID: \(id)\n") self.usersRooms.append(Room(id: id, name: roomName, participants: [uid])) self.tableView.reloadData() }) } 

为了保持超级简单,请在每个房间中存储对用户的引用。

 rooms room_0 room_name: "My Room" users user_1: true user_2: true room_1 room_name: "Their Room" users user_1: true 

然后,一个简单的查询将收集所有需要的数据,并将附加一个观察者,所以如果这个用户join任何新的房间,应用程序将被通知。

 let roomsUsersRef = self.ref.child("rooms") let queryRef = roomsUsersRef.queryOrdered(byChild: "users/user_1").queryEqual(toValue: true) queryRef.observe(.childAdded, with: { snapshot in let roomDict = snapshot.value as! [String: AnyObject] let roomName = roomDict["room_name"] as! String let usersDict = roomDict["users"] as! [String: AnyObject] let userCount = usersDict.count print("Room: \(roomName) has \(userCount) users") }) 

和输出

 Room: My Room has 2 users Room: Their Room has 1 users 

您可以使用.childChanged和.childRemoved对此进行扩展,以跟踪此用户所属的房间中发生的任何事件。 因此,如果另一个用户join或离开该用户所在的房间,应用程序将被通知; 如果房间的主人从房间里引导这个用户,应用程序也会被通知。

理想情况下,您可以在应用程序中创build单独的节点来存储所需的信息。 就像是:

 { "usersRooms": { "tzfHgGKWLEPzPU9GvkO4XE1QKy53": { "-Ki6TJWO-2R1L4SyhSqn": true, "-Ki6TKOnmToeUuBzrnbb": true, "-Ki6TLGC1Encm1v-CbHB": true } } } 

这可以让你获得用户的节点,并立即看到他们分开的房间。 一旦你完成了,你可以遍历结果来获得单独的房间。 在保持这个列表更新看起来firebasefunction或滚动自己的。