web-dev-qa-db-ja.com

Firestoreトランザクションは、単一のトランザクションで複数のドキュメントを更新します

検索した単一のトランザクションを使用してFirestoreの複数のドキュメントを更新するにはどうすればよいですか?単一のトランザクションで複数のドキュメントを更新することは可能ですか?バッチ書き込みで実行できることは知っています。

13
suhail c

トランザクション内で複数のrefを使用できることがわかりました。

var userSuhail = db.collection("users").doc("suhail");
var userSam = db.collection("users").doc("sam");
var userJohn = db.collection("users").doc("john");
var userAlfred = db.collection("users").doc("Alfred");
var userAlfredDetails = db.collection('userdetails').doc('Alfred');

db.runTransaction(function (transaction) {
  return transaction.get(userJohn).then(function (sDoc) {
    var age = sDoc.data().age + 1;
    transaction.set(userAlfred, {
      name: 'Alfred',
      age,
      details: userAlfredDetails,
    });
    transaction.set(userAlfredDetails, {
      address: 'Alfred Villa',
    });
    transaction.update( userJohn   , { age, }, );
    transaction.update( userSuhail , { age, }, );
    transaction.update( userSam    , { age, }, );
    return age;
  });
}).then(function (age) {
  console.log("Age changed to ", age);
}).catch(function (err) {

  console.error(err);
});

上記のコードにより、トランザクションはすべてのユーザーの年齢を更新します。

7
suhail c

コンセプトの証明:

var transaction = firestore.runTransaction( t => {
  return t.get(eRef)
    .then(snapshot => {
      snapshot.forEach(doc => {
        var employee = doc.data();
        if(employee.status !== 'Off work') {
          t.update(doc.ref, {
            status: 'Off work',
            returnTime: '8 am'
          })
        }
      })
    })
}).then(result => {
  console.log('Transaction success!')
}).catch(err => {
  console.log('Transaction failure: ', err)
});
2
Sean Russell