Firebase: транзакция читает и обновляет несколько документов - PullRequest
0 голосов
/ 29 апреля 2018

С помощью этого кода я могу читать и обновлять один документ в транзакции.

// Update likes in post
var docRef = admin
  .firestore()
  .collection("posts")
  .doc(doc_id);

let post = await admin.firestore().runTransaction(t => t.get(docRef));
if (!post.exists) {
  console.log("post not exist")
}
postData = { ...post.data(), id: post.id };
let likes = postData.likes || 0;
var newLikes = likes + 1;
await post.ref.update({ likes: newLikes });

Вопрос: Но мне нужно прочитать и обновить несколько документов, и каждый из них обновляется в зависимости от их содержимого. Например, я хочу обновить количество лайков в коллекции постов, как в моем коде, а также обновить общее количество лайков в документе моего профиля.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Чтобы обновить несколько документов в транзакции, вы звоните t.update() несколько раз.

let promise = await admin.firestore().runTransaction(transaction => {
  var post = transaction.get(docRef);
  var anotherPost = transaction.get(anotherDocRef);

  if (post.exists && anotherPost.exists) {
    var newLikes = (post.data().likes || 0) + 1;
    await transaction.update(docRef, { likes: newLikes });
    newLikes = (anotherPost.data().likes || 0) + 1;
    await transaction.update(anotherdocRef, { likes: newLikes });
  }
})

См. https://firebase.google.com/docs/firestore/manage-data/transactions#transactions

0 голосов
/ 29 апреля 2018

Вы можете использовать пакет , чтобы выполнить то, что вы хотите.

var batch = db.batch();

var docRef = admin
  .firestore()
  .collection("posts")
  .doc(doc_id);

var likes = ... // get the amount of likes

batch.update(docRef, { likes })

var profileRef = admin
  .firestore()
  .collection('profile')
  .doc(profId)
batch.update(profileRef, { likes })

batch.commit() // at this point everything works or not
  .then(() => {
    console.log('success!')
  })
  .catch(err => {
    console.log('something went wrong')
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...