Swift获取Firestore集合文档ID并存储至变量的技术问询
Swift获取Firestore集合中已有文档ID的正确方法
首先得纠正你之前的小错误:你写的Firestore.firestore().collection("Shops").document()其实是创建一个全新文档的引用,Firestore会自动给这个还没写入数据的文档生成随机ID,所以你拿到的肯定不是集合里已有的那些文档ID啦~
下面分两种常见场景给你解决方案:
1. 获取集合中所有文档的ID
如果需要把Shops集合里所有文档的ID都存下来,可以用getDocuments()异步获取整个集合的文档列表,然后提取每个文档的documentID:
// 定义一个全局/类级别的变量来存储文档ID数组 var shopDocumentIds: [String] = [] Firestore.firestore().collection("Shops").getDocuments { querySnapshot, error in // 处理错误 if let error = error { print("获取文档列表失败:\(error.localizedDescription)") return } // 确保查询结果不为空 guard let documents = querySnapshot?.documents else { print("Shops集合里没有任何文档") return } // 遍历所有文档,提取ID存入数组 shopDocumentIds = documents.map { $0.documentID } // 到这里,shopDocumentIds就已经包含所有已有文档的ID了 print("所有店铺文档ID:\(shopDocumentIds)") // 比如你要跳转到下一页,可以在这里把ID传递过去 // 举个UIKit的例子: // let nextVC = ShopDetailViewController() // nextVC.shopIds = shopDocumentIds // self.navigationController?.pushViewController(nextVC, animated: true) }
2. 获取符合特定条件的单个/多个文档ID
如果你只需要某个特定文档的ID(比如根据文档里的某个字段匹配),可以用whereField()添加查询条件,这样更高效:
比如假设你的文档里有一个shopName字段,要找名为"街角咖啡店"的文档ID:
// 定义变量存储目标ID var targetShopId: String? Firestore.firestore().collection("Shops") .whereField("shopName", isEqualTo: "街角咖啡店") .getDocuments { querySnapshot, error in if let error = error { print("查询特定文档失败:\(error.localizedDescription)") return } // 假设符合条件的文档只有一个,取第一个结果 if let targetDocument = querySnapshot?.documents.first { targetShopId = targetDocument.documentID print("找到目标文档ID:\(targetShopId!)") // 后续页面使用这个ID,比如SwiftUI里更新@State变量 // self.selectedShopId = targetShopId } else { print("没有找到符合条件的文档") } }
重要提示:处理异步逻辑
Firestore的查询是异步操作,所以你不能在调用getDocuments()后立刻使用shopDocumentIds或targetShopId,必须在闭包内部(也就是查询完成后)去处理这些变量的后续使用,否则会拿到空值。如果是跨页面传递,推荐在闭包里完成页面跳转或者更新绑定的状态变量。
内容的提问来源于stack exchange,提问作者user14237135
相关产品推荐
相关产品推荐

