如何在Swift中使用Firebase的sum()聚合函数计算总时长?
解决Firestore聚合查询总和提取问题
你可以通过AggregationSnapshot的sum(_:)方法直接提取总和值,同时要处理值为nil的场景(比如集合中无匹配文档时)。修改后的代码如下:
func sumTotalTime() async throws -> Int { guard let uid = self.userSession?.uid else { print("User not authenticated.") return 0 } let query = db.collection("users/\(uid)/sessions") let sumQuery = query.aggregate([.sum("totalTime")]) do { let snapshot = try await sumQuery.getAggregation(source: .server) // 提取总和,无结果时默认返回0 let totalSum = snapshot.sum("totalTime") as? Int ?? 0 print("总时长总和:", totalSum) return totalSum } catch { print("聚合查询失败:", error) throw error // 建议抛出错误让调用方处理,而非静默返回0 } }
关键说明:
snapshot.sum("totalTime")返回聚合计算结果,类型为Any?,需根据字段实际类型(此处为Int)做类型转换?? 0用于处理集合无文档的情况,此时sum结果为nil,默认返回0- 原代码中
return sum在do块外,会导致查询成功后仍返回初始值0,需将返回逻辑移至do块内 - 抛出错误能让调用方感知查询失败状态,比仅打印错误更合理
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

