【发布时间】:2021-12-11 11:41:29
【问题描述】:
想象一下这个数据库结构:
/users(collection)
userId/ (doc)
likes/ (collection)
postId1 (doc)
postId2 (doc)
我正在实现一个喜欢/不喜欢帖子的功能。
为此,我正在运行一个事务,其中我get 使用该事务的类似状态(isLiked),以便执行此(喜欢)或那个(不喜欢)。
点赞操作时,需要将点赞的帖子添加到点赞用户的likes子集合中。
但是...如果在类似操作期间删除了用户的文档(即喜欢帖子)(在 UI 中我有一个用于删除用户个人资料的部分)怎么办?
如果我这样做:
transaction.create(`users/${userId}/likes/${postId}`, denormalizedPostData);
交易是否会检测到用户文档的删除?
如果没有,如果我在删除用户的文档时也删除了用户的喜欢/子集合怎么办?
deleteUserDoc(userDocRef);
deleteFullCollection(userLikesRef, batchSize);
会
transaction.create(`users/${userId}/likes/${postId}`, data);
检测到“更改”(删除文档)并重新执行事务?
我问这个是因为我知道我们需要确保读取位于事务主体中的写入之前,以便在读取文档发生更改时重新执行事务......但是,这种情况呢?
我害怕重新创建用户文档,因为只是使用 transaction.create() 操作将文档附加到用户喜欢的集合。
我应该在事务的顶部做一个额外的阅读吗?
transaction.get(userRef); // Just to ensure the re-execution
【问题讨论】:
标签: javascript firebase google-cloud-firestore