如何从Firestore的Users集合子集合Reservations中获取数据并生成快照?
获取Firestore中Users子集合Reservations的快照方法
你的代码目前直接从Users集合的文档中提取预订数据,但根据你的Firebase结构,实际预订数据存储在每个用户文档下的Reservations子集合里。要获取子集合的快照,需要在遍历用户文档的同时,针对每个用户文档请求其下的Reservations子集合数据。
修改后的代码示例
var Reservations = [Reservation]() Firestore.firestore().collection("Users").getDocuments { (querySnapshot, error) in if let e = error { print("获取用户集合失败:\(e)") return } guard let userDocuments = querySnapshot?.documents else { print("没有用户文档") return } // 先清空数组,避免重复数据 self.Reservations.removeAll() for userDoc in userDocuments { // 获取当前用户文档下的Reservations子集合 userDoc.collection("Reservations").getDocuments { (reservationSnapshot, err) in if let e = err { print("获取用户预订数据失败:\(e)") return } guard let reservationDocs = reservationSnapshot?.documents else { return } for resDoc in reservationDocs { let data = resDoc.data() // 从子集合文档中提取预订字段 if let time = data["Time"] as? String, let date = data["Date"] as? String, let guests = data["Guests"] as? String, let restaurantName = data["RestaurantName"] as? String, let name = data["Name"] as? String, let status = data["Status"] as? String, let phone = data["Phone"] as? String { let newReservation = Reservation(restaurantName: restaurantName, name: name, phone: phone, guests: guests, time: time, date: date, status: status) self.Reservations.append(newReservation) } } // 主线程更新UI,若需等待所有数据加载完成再刷新,可使用DispatchGroup优化 DispatchQueue.main.async { self.reservationsTableView.reloadData() print(self.Reservations) } } } }
关键说明
- 遍历
Users集合的每个文档后,通过userDoc.collection("Reservations")定位到该用户的预订子集合 - 子集合的快照获取逻辑和顶层集合一致,使用
getDocuments获取一次性数据;若需要实时监听子集合变化(比如预订状态更新),可替换为addSnapshotListener - 原代码错误地从用户文档中提取预订字段,修改后改为从子集合的文档中提取对应字段
实时监听子集合快照(可选)
如果需要实时获取子集合的更新,将getDocuments替换为addSnapshotListener即可:
userDoc.collection("Reservations").addSnapshotListener { (reservationSnapshot, err) in // 处理逻辑和getDocuments一致,子集合数据变化时会自动触发闭包 }
内容的提问来源于stack exchange,提问作者Branislav Fekeč
相关产品推荐
相关产品推荐

