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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:26:20