firestore云函数用于获取集合中的聚合值

Uba*_*zad 3 firebase firebase-realtime-database google-cloud-functions angularfire2 google-cloud-firestore

假设我有一个应用程序存储用户帐单,用户添加或删除帐单.数据结构如下:

users/user_id/bills/bill_id
Run Code Online (Sandbox Code Playgroud)

票据文件结构为

{ bill_name: string, amount: number }
Run Code Online (Sandbox Code Playgroud)

我希望显示与账单名称对应的用户聚合值,可以说我在账单集合中有2个条目

{ bill_name: 'amazon', amount: 1000 }
{ bill_name: 'amazon', amount: 2000 } 
Run Code Online (Sandbox Code Playgroud)

我的输出应该是

{ bill_name: 'amazon', amount: 3000 }
Run Code Online (Sandbox Code Playgroud)

我的问题是什么是最好的聚合值

  1. 创建一个在onWrite 上触发的云功能,/user/user_id/bills/bill_id 并在/users/user_id/aggregated_bills/用户添加或删除账单时创建一个新条目,以及此功能从/users/user_id/aggregated_bills/bill_id/账单名称为"amazon" 的数据中读取数据添加对此条目进行数学处理并存储新条目aggregated_bills集合中的值.我还想知道我们是否可以从云功能中添加或读取数据库,然后引用它.在functions.firestore.document('/users/{user_id}/bills/{bill_id}').onWrite( ...

  2. 创建一个在HTTPS请求时触发的云功能,并从/users/user_id/bills/账单名称为"amazon"的位置读取数据并计算其中的聚合值,并返回响应.

  3. 可能是这个问题的任何其他解决方案

在这里,我想说,获取汇总值不仅适用于一个账单,而且适用于多个账单.假设我想向用户仪表板显示他看到前20个账单的汇总值

Jef*_*D23 5

onWrite在这种情况下,触发器最有意义.考虑将聚合结果写为父文档上的对象/映射,因为这样您只需要一次读取操作来使用数据 - 更快,更便宜.

您的云功能看起来像这样:

exports.aggregateBills = functions.firestore
    .document('user/{user_id}/bills/{bill_id}')
    .onWrite(event => {

    const bill_id = event.params.bill_id; 
    const user_id = event.params.user_id;

    const bill_name = event.data.data().bill_name;

    // ref to the parent document
    const docRef = admin.firestore().collection('users').doc(userId)

    // get all bills and aggregate
    return docRef.collection('bills')
         .where('bill_name', '==', bill_name)
         .get()
         .then(querySnapshot => {
            // get the total comment count

            const bills = []
            // loop over bills to create a plain JS array
            querySnapshot.forEach(doc => {
                bills.push( doc.data() )
            });

            const aggregateData = 'do your calculations here'


            // run update
            return docRef.update({ aggregateData })
         })
});
Run Code Online (Sandbox Code Playgroud)