提问者:小点点

onWrite聚合函数


在我非常简单的应用程序中,每次添加/更改/删除新事务时,我都会保持一个正在运行的聚合。我意识到,我可以简单地循环每次交易,但这似乎很昂贵。因此,我打开事件类型并应用不同的逻辑,这取决于它是创建/更新/删除。

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
        });
      });
    });

这让人感觉每次都需要大量的代码来计算出正在发生的事件。有没有更好的办法处理这件事?


共1个答案

匿名用户

大部分代码在我看来都很好。我只使用fieldvalue.increment()操作来更新预算,而不是事务:

const budgetRef = db.collection('budgets').doc(context.params.budgetId);

budgetRef.update({ balance: admin.firestore.FieldValue.increment(adjustment) });

有关此操作的更多信息,请参阅递增数值的文档。