比方说,我有一个应用程序可以存储用户账单,用户可以添加或删除账单。这些数据的结构如下:
users/user_id/bills/bill_id票据文档结构
{ bill_name: string, amount: number }我想要显示的是与票据名称对应的用户聚合值,假设我在票据集合中有两个条目。
{ bill_name: 'amazon', amount: 1000 }
{ bill_name: 'amazon', amount: 2000 } 我的输出应该是
{ bill_name: 'amazon', amount: 3000 }我的问题是,获得聚合值的最佳方法是什么?
/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( ...中/users/user_id/bills/读取账单名为“amazon”的数据,并计算那里的聚合值,然后返回响应。在这里,我想说的是,获得聚合值不仅是一张钞票,而且是同时多张钞票。假设我想显示用户仪表板,他看到的是他的前20张账单的汇总值。
发布于 2017-12-17 12:45:47
在这种情况下,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 })
})
});https://stackoverflow.com/questions/47854756
复制相似问题