首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取集合中聚合值的防火墙云函数

用于获取集合中聚合值的防火墙云函数
EN

Stack Overflow用户
提问于 2017-12-17 11:44:47
回答 1查看 2.3K关注 0票数 3

比方说,我有一个应用程序可以存储用户账单,用户可以添加或删除账单。这些数据的结构如下:

代码语言:javascript
复制
users/user_id/bills/bill_id

票据文档结构

代码语言:javascript
复制
{ bill_name: string, amount: number }

我想要显示的是与票据名称对应的用户聚合值,假设我在票据集合中有两个条目。

代码语言:javascript
复制
{ bill_name: 'amazon', amount: 1000 }
{ bill_name: 'amazon', amount: 2000 } 

我的输出应该是

代码语言:javascript
复制
{ 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/读取数据,其中票据名为“amazon”,向该条目进行算术,并将新值存储在aggregated_bills集合中。另外,我想知道我们是否可以从云函数中添加或读取数据库,然后引用它。在functions.firestore.document('/users/{user_id}/bills/{bill_id}').onWrite( ...
  2. 创建一个云函数来触发HTTPS请求,并从/users/user_id/bills/读取账单名为“amazon”的数据,并计算那里的聚合值,然后返回响应。
  3. 可能是解决这个问题的任何其他方法

在这里,我想说的是,获得聚合值不仅是一张钞票,而且是同时多张钞票。假设我想显示用户仪表板,他看到的是他的前20张账单的汇总值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-17 12:45:47

在这种情况下,onWrite触发器最有意义。考虑将聚合结果作为对象/映射写入父文档,因为这样您只需要一次读取操作就可以使用数据--速度更快、成本更低。

您的云功能应该如下所示:

代码语言:javascript
复制
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 })
         })
});
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47854756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档