Swift中如何查询Firestore数据库同名字段及对应setnumber数组
Swift中Firestore查询ExeName并分组对应setnumber数组
1. 基础查询与数据分组实现
确保已导入FirebaseFirestore依赖,通过以下代码查询目标集合中所有包含ExeName字段的文档,并按ExeName键值分组收集对应的setnumber数组:
import FirebaseFirestore let db = Firestore.firestore() // 替换为你的目标集合名称 let targetCollection = db.collection("your-collection-name") targetCollection .whereField("ExeName", isNotEqualTo: FieldValue.null()) // 筛选存在ExeName字段的文档 .getDocuments { snapshot, error in guard error == nil else { print("查询失败: \(error!.localizedDescription)") return } guard let documents = snapshot?.documents else { print("未匹配到任何文档") return } // 初始化字典用于分组存储ExeName对应的setnumber数组 var exeNameSetNumberMap = [String: [Any]]() for document in documents { let docData = document.data() // 解析文档中的ExeName和setnumber字段 guard let exeName = docData["ExeName"] as? String, let setNumber = docData["setnumber"] else { continue } // 更新分组字典 if var existingNumbers = exeNameSetNumberMap[exeName] { existingNumbers.append(setNumber) exeNameSetNumberMap[exeName] = existingNumbers } else { exeNameSetNumberMap[exeName] = [setNumber] } } // 遍历输出结果(可根据业务需求替换为后续逻辑) for (exeName, setNumbers) in exeNameSetNumberMap { print("ExeName: \(exeName) 对应的setnumber数组: \(setNumbers)") } }
2. 适配setnumber本身为数组的场景
如果setnumber字段本身就是数组类型,调整解析逻辑合并数组:
// 在文档遍历的解析部分替换为以下代码 guard let exeName = docData["ExeName"] as? String, let setNumberArray = docData["setnumber"] as? [Any] else { continue } if var existingNumbers = exeNameSetNumberMap[exeName] { existingNumbers.append(contentsOf: setNumberArray) exeNameSetNumberMap[exeName] = existingNumbers } else { exeNameSetNumberMap[exeName] = setNumberArray }
3. 实时监听数据变化
若需要实时同步最新数据,将getDocuments替换为addSnapshotListener:
targetCollection .whereField("ExeName", isNotEqualTo: FieldValue.null()) .addSnapshotListener { snapshot, error in // 内部处理逻辑与上述查询逻辑完全一致 // 每次数据变化时会自动触发回调更新分组结果 }
内容的提问来源于stack exchange,提问作者Kuba Stefański
相关产品推荐
相关产品推荐

