可以说我有一个存储用户账单,用户添加或删除账单的应用程序。数据的结构为:
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/
读取的数据中帐单名称为'amazon'的数据进行添加,对该条目进行数学运算并将新值存储在Aggregated_bills集合。我也想知道我们是否可以从云功能中添加或读取数据库而不是被引用。在
functions.firestore.document('/users/{user_id}/bills/{bill_id}').onWrite( ...
中创建一个在HTTPS请求上触发的云函数,并从账单名称为“ amazon”的
/users/user_id/bills/
中读取数据,并在那里计算汇总值,然后返回响应。可能是此问题的任何其他解决方案
在这里我想说的是,获得汇总值不仅是为了
一张帐单,但同时用于多个帐单。可以说我想
向用户仪表板显示他正在查看其汇总值的位置
前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 })
})
});
关于firebase - firestore云功能,用于获取集合中的汇总值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47854756/