假设我有一个存储用户账单的应用,用户添加或删除账单。数据的结构如下:
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 }
我的问题是什么才能获得聚合值
创建一个在 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( ...
创建一个在HTTPS请求时触发的云功能,并从/users/user_id/bills/
读取数据名称为'amazon'的数据并计算其中的聚合值,然后返回响应。
可能是此问题的任何其他解决方案
这里我想说获取聚合值不仅仅是为了 一张账单,但同时支付多张账单。我想说我想 向用户仪表板显示他正在看到他的聚合值 前20名账单
答案 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 })
})
});