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