【问题标题】:firestore cloud functions for getting aggregated values in collection用于在集合中获取聚合值的 firestore 云函数
【发布时间】:2017-12-17 11:44:47
【问题描述】:

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

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/ 读取数据的内容,其中账单名称为“amazon”,添加对此条目进行数学运算并将新值存储在aggregated_bills 集合。 我还想知道我们是否可以从云功能中添加或读取数据库,而不是引用它。在functions.firestore.document('/users/{user_id}/bills/{bill_id}').onWrite( ...

  2. 创建一个触发 HTTPS 请求的云函数,并从账单名称为“amazon”的/users/user_id/bills/ 读取数据并计算那里的聚合值,然后返回响应。

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

在这里我想说的是,获取聚合值不仅适用于 一张账单,但同时用于多张账单。可以说我想 向用户仪表板显示他正在查看其汇总值的位置 排名前 20 的账单

【问题讨论】:

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


    【解决方案1】:

    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 })
             })
    });
    

    【讨论】:

    • +1 在这方面,编写聚合数据在 NoSQL 解决方案中很常见,而 Cloud Functions 是执行此类操作的绝佳工具。另一种方法是在客户端进行聚合(当您添加账单时),但这需要一些非常棘手的安全规则来确保恶意用户无法执行无效写入。由于 Cloud Functions 在受信任的环境中运行,因此您不必担心有人编写自己的聚合代码会违反您的业务规则。
    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多