Firebase 我可以在Firestore事务中循环浏览文档吗?

Firebase 我可以在Firestore事务中循环浏览文档吗?,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我试图在一个firestore事务中运行多个文档更新,我想知道这是否是一种反模式 我有一个名为“Group”的文档,其中包含一个名为“members”的数组,该数组包含来自用户集合的不同ID。现在我想在一个事务中遍历所有成员并更新相应的用户文档。这可能吗 我尝试使用.forEach()遍历所有成员,但问题是.forEach()不支持async/await或使用承诺。以下内容可以解决此问题: var firestore = firebase.firestore(); //..... var g

我试图在一个firestore事务中运行多个文档更新,我想知道这是否是一种反模式

我有一个名为“Group”的文档,其中包含一个名为“members”的数组,该数组包含来自用户集合的不同ID。现在我想在一个事务中遍历所有成员并更新相应的用户文档。这可能吗


我尝试使用.forEach()遍历所有成员,但问题是.forEach()不支持async/await或使用承诺。

以下内容可以解决此问题:

var firestore = firebase.firestore();

//.....

var groupDocRef = firestore.doc('collectionRef/docRef');

return firestore
          .runTransaction(function(transaction) {
            var arrayOfMemberIds;
            return transaction
              .get(groupDocRef)
              .then(function(groupDoc) {
                if (!groupDoc.exists) {
                  throw 'Group document does not exist!';
                }

                arrayOfMemberIds = groupDoc.data().members;

                return transaction.update(groupDocRef, {
                  lastUpdate: firebase.firestore.FieldValue.serverTimestamp()
                });

              })
              .then(function() {

                arrayOfMemberIds.forEach(function(memberId) {
                  transaction = transaction.update(
                    firestore.collection('users').doc(memberId),
                    { foo: 'bar' }
                  );

                });

                return transaction;
              });
          });
这将起作用,因为该方法返回可用于链接方法调用的事务实例

还要注意,我们必须更新初始的
groupDoc
。否则,将抛出以下错误:
FirebaseError:“事务中读取的每个文档也必须写入。”
。在上面的示例中,我们只使用时间戳更新
lastUpdate
字段。由您选择要执行的更新


通过如下设置一些安全规则,可以轻松测试此代码的事务方面:

service cloud.firestore {
  match /databases/{database}/documents {

    match /collectionRef/{doc} {
      allow read: if true;
    }

    match /users/{user} {
      allow read: if false;
    }

  }
}
由于无法写入
用户
集合,因此
事务
将失败,
collectionRef/docRef
文档将不更新



另一种(甚至更好)测试事务方面的方法是删除一个
用户
文档。由于
update()
方法在应用于不存在的文档时失败,因此整个
事务将失败。

您所尝试的。。。。!?