firestore云函数用于获取集合

时间:2017-12-17 11:44:48

标签: firebase firebase-realtime-database google-cloud-functions angularfire2 google-cloud-firestore

假设我有一个存储用户账单的应用,用户添加或删除账单。数据的结构如下:

users/user_id/bills/bill_id

将帐单结构记录为

{ bill_name: string, amount: number }

我想要显示与帐单名称对应的用户聚合值 假设我在账单集合中有2个条目

{ bill_name: 'amazon', amount: 1000 }
{ bill_name: 'amazon', amount: 2000 } 

我的输出应该是

{ bill_name: 'amazon', amount: 3000 }

我的问题是什么才能获得聚合值

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

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

    < / LI>
  3. 可能是此问题的任何其他解决方案

  4.   

    这里我想说获取聚合值不仅仅是为了   一张账单,但同时支付多张账单。我想说我想   向用户仪表板显示他正在看到他的聚合值   前20名账单

1 个答案:

答案 0 :(得分: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 })
         })
});