在我非常简单的应用程序中,每次添加/更改/删除新事务时,我都会保持一个正在运行的聚合。我意识到,我可以简单地循环每次交易,但这似乎很昂贵。因此,我打开事件类型并应用不同的逻辑,这取决于它是创建/更新/删除。
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) });
有关此操作的更多信息,请参阅递增数值的文档。