Firebase Function如何仅计算更新事件所属租户的待结发票总额并更新租户文档
解决方案
这个需求完全可以实现,你现有代码的问题是使用了collectionGroup('invoices')会查询整个数据库中所有名为invoices的集合,没有限定本次触发事件对应的租户范围。
实现逻辑说明
- 从云函数触发的路径参数
context.params中直接获取当前更新发票所属的userId和tenantId - 仅查询该租户下的
invoices集合中状态为Pending的发票 - 统计金额总和后写入对应租户文档
修改后的完整代码
exports.invoiceUpdated = functions.firestore .document('/users/{userId}/tenants/{tenantId}/invoices/{invoiceId}') .onUpdate(async (snap, context) => { // 获取当前触发事件的路径参数 const { userId, tenantId } = context.params; // 可选优化:仅当status字段发生变化时才执行计算,避免无效触发 const beforeStatus = snap.before.data().status; const afterStatus = snap.after.data().status; if (beforeStatus === afterStatus) { return null; } // 仅查询当前租户下的待结发票,而不是全库查询 const invoicesQuery = db .collection('users') .doc(userId) .collection('tenants') .doc(tenantId) .collection('invoices') .where('status', '==', 'Pending'); const task = await invoicesQuery.get(); let total = 0; if (!task.empty) { task.forEach(doc => { total += doc.data().amount || 0; }); } // 将统计结果写入对应租户文档 const tenantDocRef = db .collection('users') .doc(userId) .collection('tenants') .doc(tenantId); // 首次写入字段可使用set+merge参数,避免无字段时update报错 await tenantDocRef.set({ pendingInvoiceTotal: total }, { merge: true }); return null; });
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

