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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:00:04