如何获取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č
相关产品推荐
相关产品推荐

