You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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č

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:01:18