【发布时间】:2019-04-26 16:59:53
【问题描述】:
在对文档列表执行多个更新事务时,如果一个或多个文档未处于特定状态,则无法更新任何文档。这样做的最佳方法是什么
我需要更新集合中一组文档的状态字段,这些文档具有另一个字段的特定值 - 将其称为组。我根据 group 字段查询集合,这将返回一个我用 forEach 迭代的快照列表。在每次迭代中,我都需要将文档的状态更新为新状态——但前提是它已经具有特定状态。如果没有,则不必更新组中的任何文档。 通常,这需要某种回滚。 firebase 中的批处理或事务似乎没有回滚选项 - 我想知道以下是否有效。
在循环中将更新添加到批处理中。如果在循环结束时所有都有效,则返回提交,否则返回被拒绝的 Promise。
问题是 - 这样的批次是可以接受的还是有副作用?
interface IDoc {
Status: string,
Time: any
}
async processBatch(group:string) : Promise<void>
{
const batch = this.afs.firestore.batch();
let snapshot = await this.afs.collection('Docs', ref => ref.where('Group', '==', gropup).get().toPromise();
let valid:boolean = true;
snapshot.forEach(item => {
const doc = item.data() as IDoc;
if (valid && doc.Status === 'Complete') {
batch.update(item.ref, {Status: 'Approve', Time: firestore.FieldValue.serverTimestamp()});
}
else {
valid = false;
}
});
return valid ? batch.commit() : Promise.reject();
}
【问题讨论】: