我在firestore集合查询上执行了一系列更新,每个更新都需要访问当前值。我知道交易是执行这些更新的原子方式,但是可以批量进行这一系列更新吗?
当前,我这样更新收藏集:
let query;
query = db.collection('focuses');
query = query.where('userId', '==', auth.currentUser.uid);
query = query.where('active', '==', true);
query.get().then(snapshot => {
const batch = db.batch();
snapshot.forEach(doc => {
batch.update(
db.collection('focuses').doc(doc.id),
{
active: false,
working: true,
time: doc.data().workPeriod * 60,
}
);
});
batch.commit().then(() => {
auth.signOut().catch(error => {
console.error(error);
});
}).catch(error => {
console.error(error);
});
});
这可行,但是workPeriod
字段正在事务外部访问,所以我的理解是它可能容易受到同时访问的影响。
那么是否可以为每个批次更新进行交易?如果不是,那么最好的方法是从一系列事务中收集每个Promise
,然后使用Promise.all
来建立一个回调,在完成一系列事务后将调用该回调? >
答案 0 :(得分:0)
否,无法批量交易。您必须选择批处理或事务进行原子更新。事务与批处理类似,因为所有更新都适用,或者没有更新。批处理与事务之间的区别在于,批处理只是写,但事务先读后写。