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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:22:45