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)
我的问题是什么是最好的聚合值
创建一个在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( ...
创建一个在HTTPS请求时触发的云功能,并从/users/user_id/bills/账单名称为"amazon"的位置读取数据并计算其中的聚合值,并返回响应.
可能是这个问题的任何其他解决方案
在这里,我想说,获取汇总值不仅适用于一个账单,而且适用于多个账单.假设我想向用户仪表板显示他看到前20个账单的汇总值
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)
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |