Swift操作Firestore时如何将文档ID保存到文档自身字段中
Swift 为Firestore文档写入自身ID到指定字段
存量文档更新(适配你当前的场景)
你现在已存在ID为7D3fuw3fri6oj287SySW的menu集合文档,直接调用更新接口写入menu_id字段即可:
import FirebaseFirestore // 初始化Firestore实例 let db = Firestore.firestore() // 定位到目标文档 let targetDoc = db.collection("menu").document("7D3fuw3fri6oj287SySW") // 执行字段更新 targetDoc.updateData([ "menu_id": targetDoc.documentID ]) { error in if let error = error { // 处理错误逻辑 print("更新失败: \(error.localizedDescription)") return } // 更新成功逻辑 print("menu_id字段已写入对应文档ID") }
如果需要给menu集合下所有缺少menu_id字段的存量文档批量补全,可以用批量写入减少请求次数:
db.collection("menu").getDocuments { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("获取集合数据失败: \(error?.localizedDescription ?? "未知错误")") return } let writeBatch = db.batch() for doc in documents { // 已经存在menu_id字段的文档跳过,避免重复写入 if doc.data()["menu_id"] != nil { continue } writeBatch.updateData( ["menu_id": doc.documentID], forDocument: doc.reference ) } writeBatch.commit { batchError in if let batchError = batchError { print("批量更新失败: \(batchError.localizedDescription)") return } print("所有存量文档menu_id字段补全完成") } }
新建文档时自动写入ID的最佳实践
后续新建menu文档时,不需要先创建文档再拿ID二次更新,先获取自动生成的文档引用,将ID直接塞入写入数据后一次性提交即可,避免两次写入带来的配额浪费和数据不一致问题:
// 先生成带自动ID的文档引用,此时还未和服务端交互 let newMenuDoc = db.collection("menu").document() // 组装写入数据,直接把引用的ID赋值给menu_id let data: [String: Any] = [ "name": "ayam goreng", "menu_id": newMenuDoc.documentID, // 其余业务字段自行补充,比如price、category等 ] // 一次性提交所有数据 newMenuDoc.setData(data) { error in if let error = error { print("文档创建失败: \(error.localizedDescription)") return } print("文档创建成功,menu_id已同步写入") }
注意:不建议使用
addDocument(data:)方法直接写入后,再从返回结果中拿文档ID做二次更新,这种方式会产生两次写请求,极端情况下可能出现文档创建成功但ID字段更新失败的不一致问题。
内容的提问来源于stack exchange,提问作者Bill Rei
相关产品推荐
相关产品推荐

