Каков наилучший подход для выполнения пакетного обновления или транзакции, который читает значение первого обновления, а затем использует это значение для дальнейших обновлений?
Вот пример:
//create person
const id = await db
.collection("person")
.add({ ...person })
.then(ref => ref.id)
//then do a series of updates
let batch = db.batch()
const private_doc = db
.collection("person")
.doc(id)
.collection("private")
.doc("data")
batch.set(private_doc, {
last_modified,
version: 1,
versions: []
})
const some_index = db.collection("data").doc("some_index")
batch.update(some_index, {
[id]: { first_name: person.first_name, last_name: person.last_name, last_modified }
})
const another_helpful_doc = db.collection("some_other_collection").doc("another_helpful_doc")
batch.update(another_helpful_doc, {
[id]: { first_name: person.first_name, last_name: person.last_name, image: person.image }
})
return batch.commit().then(() => {
person.id = id
return person
})
Здесь вы можете увидеть, если в каком-либо пакетном обновлении произошла ошибка, человек, который делает c, все равно будет создан - что плохо. Я мог бы добавить catch
, чтобы удалить человека, который делает c, если что-то не получается, однако мне интересно узнать, возможно ли это с транзакциями или пакетами.