Typescript云函数实现Firestore指定category文档的duration字段求和
Firestore 按分类统计 duration 字段总和实现代码
以下是基于你提供的云函数模板修改的完整实现,可直接使用:
import * as admin from 'firebase-admin' import * as functions from 'firebase-functions' admin.initializeApp() // 保留原有触发器配置 export const updateCharts = functions.firestore.document('users/{UserId}/count/{uid}') .onWrite(async(change, _) => await updateStats(change)) async function updateStats (change: functions.Change<functions.firestore.DocumentSnapshot>){ const chartRating = change.after.ref.parent // 原有标题统计逻辑保留 const gameTitleCount = (await chartRating.where('Title', '==', 'Game').get()).size; // 新增:统计category为category1的所有文档duration总和 let category1TotalDuration = 0 // 按category字段过滤查询 const categoryDocs = await chartRating.where('category', '==', 'category1').get() // 遍历累加时长 categoryDocs.forEach(doc => { const duration = doc.data()?.duration if (typeof duration === 'number') { category1TotalDuration += duration } }) const parentRef = chartRating.parent! console.log(`${parentRef.path} 下Game类标题数量:${gameTitleCount},category1总时长:${category1TotalDuration} 微毫秒`) // 结果写入父文档,可按需调整字段名 await parentRef.update({ Title: gameTitleCount, category1TotalDuration: category1TotalDuration }) }
核心逻辑说明
- 条件过滤:调用
where('category', '==', 'category1')方法筛选出所有分类为category1的文档 - 累加计算:遍历查询返回的文档快照,逐个提取
duration字段累加,额外增加了类型判断避免非数值字段导致程序报错 - 结果落地:统计完成后将总时长写入父级文档,字段名可根据业务需求自行修改
注意:如果单批次查询的文档量级超过1万条,建议改用Firestore聚合查询或者提前做增量计数,避免全量扫描带来的性能损耗和额外成本。
内容的提问来源于stack exchange,提问作者akhicoda
相关产品推荐
相关产品推荐

