我有一个文档,其中包含一个整数数组字段,该文档通过onCreate()
触发器每周7天,每天创建一次。我需要计算数组中每个项目的出现次数。在另一个应用程序中,我先使用get()
,然后使用set()
(或update()
(。我将在数组中运行一个for循环,并将所有promise添加到promise数组中,最后:Promise.all{promisesArray}
。
刚刚发现了交易,它对我非常基本的javascript来说还可以。
我的问题是,我应该使用哪一个,在我的情况下使用交易有什么好处(如果有的话(?该文档是由管理员而非最终用户创建的,并不是说它将由数百万用户创建。
下面是我用来计数出现次数的代码:
// Ref.get() then Ref.update()
promisesArray.push(docRef.get()
.then(doc => {
return docRef.update('count', doc.data().count + 1);
})).catch(error => {
console.log("Error" + error);
});
// Using a Transaction
promisesArray.push(firestore.runTransaction(transaction => {
return transaction.get(docRef)
.then(doc => {
return transaction.update(docRef, {
count: doc.data().count + 1
});
});
}).catch(error => {
console.log("Error" + error);
}));
如果您知道一个文档在任何时候只能由一个程序编写,则不需要事务。事务的目的是处理多个用户/程序可能同时试图编写文档的情况。或者,您需要在一次写入操作中原子地更新一堆文档,以确保所有文档之间的一致性。
如果您在onCreate期间只在云函数中编写一个文档,那么您可能不需要事务。如果由于一些常见的计算,您需要几个文档同时出现,那么您可能确实需要一个事务。