在我非常简单的应用程序中,每次添加/更改/删除新事务时,我都会保持一个正在运行的聚合。我意识到我每次都可以简单地循环处理每笔交易,但这似乎很昂贵。因此,我打开事件类型并应用不同的逻辑,这取决于它是否是创建/更新/删除。
exports.aggregateTransactions = functions.firestore
.document('budgets/{budgetId}/transactions/{transactionId}')
.onWrite(async (change, context) => {
adjustment = 0;
if(change.after.data == undefined){
adjustment = -1 * change.before.data().amount;
}
if(change.before.data && change.after.data){
adjustment = change.after.data().amount - change.before.data().amount;
}
if(!change.before.data && change.after.data){
adjustment = change.after.data().amount;
}
const budgetRef = db.collection('budgets').doc(context.params.budgetId);
await db.runTransaction(async (transaction) => {
const budgetDoc = await transaction.get(budgetRef);
const newBalance = budgetDoc.data().balance + adjustment;
transaction.update(budgetRef, {
balance: newBalance
});
});
});
这感觉就像每次都有很多代码,只是为了弄清楚发生了什么样的事件。有更好的方法来处理这个问题吗?
大多数代码对我来说都很好。我只想使用FieldValue.increment()
操作来更新预算,而不是事务:
const budgetRef = db.collection('budgets').doc(context.params.budgetId);
budgetRef.update({ balance: admin.firestore.FieldValue.increment(adjustment) });
有关此操作的详细信息,请参阅有关递增数值的文档。