gpt4 book ai didi

firebase - 我可以循环浏览 Firestore 交易中的文档吗?

转载 作者:行者123 更新时间:2023-12-04 10:53:43 25 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题.

1年前关闭。




Improve this question




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

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

我试图用 .forEach() 遍历所有成员,但问题是 .forEach() 不支持 async/await 或据我所知使用 promises。

最佳答案

以下应该可以解决问题:

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;
});
});

这将起作用,因为 update() 方法返回可用于链接方法调用的事务实例。

另请注意,我们必须更新初始 groupDoc .如果没有,则会抛出以下错误: FirebaseError: "Every document read in a transaction must also be written." .在上面的例子中,我们只是更新了一个 lastUpdate带有时间戳的字段。您可以选择要进行的更新!

您可以通过如下设置一些安全规则来轻松测试此代码的事务方面:
service cloud.firestore {
match /databases/{database}/documents {

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

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

}
}

由于无法写入 users收藏, Transaction将失败并且 collectionRef/docRef文档将 不是 被更新。

另一种(甚至更好)测试事务方面的方法是删除 users 之一。文档。自 update()如果应用于不存在的文档,则方法失败,整个 Transaction将失败。

关于firebase - 我可以循环浏览 Firestore 交易中的文档吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59332559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com