繁体   English   中英

如何在 firebase v9 的 firesrore 中为每个用户只更新一次特定字段的数据?

[英]How to update a specific field of data only one time for each user in firesrore in firebase v9?

我正在创建一个类似 sns 的 web 应用程序,并试图实现一个“喜欢帖子”function。基本上每个帖子都有 firestore 中的数据,例如帖子的标题,帖子的图片,帖子的喜欢数量等等。我想做的是,如果用户点击任何帖子上的赞按钮,点击帖子的赞数将增加 1。但是,我不知道如何限制每个用户只能喜欢每个帖子一次。 我当前的代码适用于增加喜欢的数量,但用户可以在用户点击后喜欢帖子的次数。 我完全是 firebase、react 和 javascript 的初学者,非常感谢您的帮助。 谢谢你。

这是我的代码,用于增加喜欢的数量。

 const likeHandle = async () => {
        const docRef = doc(db, "posts", postId);

        await updateDoc(docRef, {
            noLikes: noLikes + 1
        });
    }

您将无法在跟踪点赞数量的同一文档中大规模执行此操作,因为每个文档都有最大大小。

您需要做的是将每对用户和点赞的记录存储在单独集合中其自己的文档中,并检查以确保任何新的点赞请求尚未在另一个集合中表示。 如果那对用户和帖子有记录,您的 UI 也应该禁用点赞,这样用户就不会看到您不希望他们选择的选项。

没有直接的方法来限制用户写入特定数据的频率。

但是,您可以做的是:

  • 将带有 UID 的usersWhoVoted字段添加到文档,或它下面的userWhoVoted子集合。
  • 在一次操作中将增加的点赞数和 UID 写入数据库(如果您选择子集合,则使用事务/批量写入)。
  • 使用仅允许用户在该操作中还添加了 UID 时增加计数的安全规则,并且仅在删除它时才减少计数(如果这也是您想要支持的用例)。

您可能还应该使用原子increment操作,以防止依赖于可能过时的客户端 state(尽管您的安全规则应该捕获并拒绝这种情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM