При выполнении ряда транзакций обновления в списке документов, если один или несколько документов не находятся в определенном состоянии, ни одна из них не может быть обновлена. Каков наилучший способ сделать это
Мне нужно обновить поле состояния для набора документов в коллекции, которые имеют конкретное значение для другого поля - назовите его group. Я запрашиваю коллекцию на основе поля группы, это возвращает список снимков, который я повторяю с помощью forEach. На каждой итерации мне нужно обновлять статус документа до нового статуса - но только если он уже имеет определенный статус. Если это не так, то ни один из документов в группе не должен быть обновлен.
Как правило, это потребует некоторого отката. Похоже, что нет опции отката для пакета или транзакций в Firebase - мне интересно, действительно ли следующее.
В цикле добавьте обновления в пакет. Если в конце цикла все верны, верните коммит, в противном случае отправьте обратно отклоненное обещание.
Вопрос в том, является ли партия такой приемлемой или есть побочные эффекты?
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();
}