查看子集合文档以进行更新的 Firebase 函数和 returns 父集合中值的总和

Firebase Function that looks into child collection documents for update and returns sum of values in parent collection

我的 Firestore 数据库设置如下:

/users/{userId}/tenants/{tenantId}/invoices/{invoiceId}

在每个发票凭证(InvoiceId)中,都有[“状态”]和[“金额”]字段。 ["status"] 可以是“Pending”或“Paid”。

每次 invoiceId 文档中的“status”更新时,我想从相应的发票集合中获取所有“amount”的总和,其中“status”==“Pending”刚刚更新。然后我想把这个新的balance数据设置到各自的tenantId文档中。

以下脚本计算 所有文档 的总和,其中每当更新 invoiceId 文档时“status”==“Pending”。但是,我只想计算已更新的 发票集合的“金额”总和(不是全部)。

例如:假设有租户A和B,每个都有很多发票。租户 A 下的发票已更新。我想为租户 A(而不是 B)计算新的“金额”总和。

让我知道这是否可能。

exports.invoiceUpdated = functions.firestore
    .document('/users/{userId}/tenants/{tenantId}/invoices/{invoiceId}')
    .onUpdate(async (snap, context) => {

        const task = await (db.collectionGroup('invoices').where('status', '==', "Pending").get());

        if (task.empty) {
            console.log('No pending invoices...')
            return;
        }
        var total= 0;
        task.forEach(element => {
            console.log(element.data().amount)
            total += element.data().amount

        })

    });```

这是一个类似的问题:

一般情况下,您需要做的是从子文档中获取父文档,可以通过:

snapshot.getRef().getParent()

当您使用以下文档参考时:

/users/{userId}/tenants/{tenantId}/invoices/{invoiceId}

这意味着您正在尝试获取与单个用户对应的单个发票的更新。

另一方面,在以下查询中:

db.collectionGroup('invoices').where('status', '==', "Pending")

由于您使用的是 collectionGroup,这意味着您正在尝试从所有“发票”子集合中过滤文档,其中“状态”字段的值为“待处理”。这意味着您将从 整个 数据库中获取所有文档,无论用户是什么。

The following script calculates the sum for all documents where "status" == "Pending" whenever an invoiceId document is updated. However, I would like to calculate the sum of "amounts" only for the invoice collection that was updated (not all).

如果要检查对应单个用户的发票的“状态”是否发生变化,则应使用以下参考:

/users/{userId}/tenants/{tenantId}/invoices/

要计算新金额,应添加相同的引用,因为它仅指向对应于单个用户的发票。

但是,每次单张发票的状态发生变化时计算所有发票的总和可能不是最佳选择。您应该考虑添加一个每次发票状态更改时都应更新的计数。这意味着当您想要通知用户新的总和时,将涉及单个读取操作。否则,您必须支付与您查询的文档数量相同的阅读次数 returns.