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

如何获取Firestore子集合中指定文档的ID?

解决Firestore预订文档更新的ID问题

问题根源

你当前代码错误地将用户UID作为Reservations集合下的文档ID,但从数据库结构来看,Reservations中的文档使用的是Firestore自动生成的随机ID,而非用户UID。这就导致你指定的文档路径不存在,触发了路径错误。

解决方案步骤

1. 获取用户所有预订的文档ID及数据

要更新特定预订,首先需要查询用户的Reservations集合,获取所有文档的ID和对应的预订数据:

guard let uid = Auth.auth().currentUser?.uid else { return }
let reservationsRef = Firestore.firestore().collection("Users").document(uid).collection("Reservations")

reservationsRef.getDocuments { snapshot, error in
    guard let snapshot = snapshot, error == nil else {
        print("获取预订列表失败: \(error!)")
        return
    }
    
    // 遍历所有预订文档,拿到ID和数据
    for document in snapshot.documents {
        let reservationID = document.documentID // 这就是你需要的预订ID
        let reservationData = document.data()
        print("预订ID: \(reservationID),数据: \(reservationData)")
        
        // 这里可以根据预订的特征(比如日期、订单号)判断是否是要更新的目标
        // 例如 if reservationData["date"] as? String == "2024-05-20" { ... }
    }
}

2. 定位目标ID并更新文档

找到目标预订的ID后,用该ID替换原来的用户UID,调用updateData:

// 假设你已经通过查询拿到了目标预订ID:targetReservationID
guard let uid = Auth.auth().currentUser?.uid, let targetReservationID = targetReservationID else { return }

let targetRef = Firestore.firestore().collection("Users").document(uid).collection("Reservations").document(targetReservationID)

targetRef.updateData(data) { error in
    if let error = error {
        print("更新文档失败: \(error)")
    } else {
        print("文档更新成功")
    }
}

优化建议

  • 如果需要频繁根据特定字段(比如订单号)定位预订,可以在Reservations集合中为该字段创建索引,提升查询效率。
  • 保存预订时,建议将生成的文档ID同步存储到用户文档或本地存储中,后续更新时直接取用,避免重复查询。

内容的提问来源于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 22:55:16