Как использовать транзакции или пакеты для чтения значения обновления, а затем выполнять дополнительные обновления с использованием этого значения? - PullRequest
0 голосов
/ 21 марта 2020

Каков наилучший подход для выполнения пакетного обновления или транзакции, который читает значение первого обновления, а затем использует это значение для дальнейших обновлений?

Вот пример:

  //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, если что-то не получается, однако мне интересно узнать, возможно ли это с транзакциями или пакетами.

1 Ответ

1 голос
/ 21 марта 2020

Вы можете вызвать метод doc() без указания пути, чтобы создать DocumentReference с автоматически сгенерированным идентификатором и затем использовать ссылку потом. Обратите внимание, что документ, соответствующий DocumentReference, НЕ создан.

Итак, сработает следующее, поскольку все записи / обновления включены в пакетную запись:

const new_person_ref = db.collection("person").doc();
const id = new_person_ref.id;

let batch = db.batch()

batch.set(new_person_ref, { ...person })

const private_doc_ref = db  // <- note the addition of ref to the variable name, it could help avoiding errors, as this is not a DocumentSnapshot but a DocumentReference.
    .collection("person")
    .doc(id)
    .collection("private")
    .doc("data")

batch.set(private_doc_ref, {
    last_modified,
    version: 1,
    versions: []
})

//....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...