【问题标题】:How to limit users daily post limit (MERN)如何限制用户每日发帖限制 (MERN)
【发布时间】:2023-03-25 00:37:01
【问题描述】:

我目前使用passport进行身份验证,使用mongodb存储用户信息。

但是,我一直在尝试限制用户的每日发帖限制。我正在考虑在用户架构中设置一个像每日发布限制这样的字段,并且每当用户发布某些内容时,我都会扣除计数。

const user = new mongoose.Schema({


githubId: {
    required: true,
    type: String,
  },

  username: {
    required: true,
    type: String,
  },

  dailyPostLimit: {
    type: Number,
    default: 3,
  },
});

但是我不确定是否有办法每天将该计数重置为默认值 (3)。 CRON 任务适合这里还是有更简单的方法来完成这个?

【问题讨论】:

    标签: node.js mongodb mongoose passport.js mongodb-atlas


    【解决方案1】:

    cron 任务非常适合重置像这样的值,并且缓存像这样的值是解决此问题的合理方法。但是,请记住,您正在缓存此值,并且缓存失效是一个困难问题,通常会导致错误和额外的复杂性。

    统计帖子

    我的第一个直觉不是缓存,而是每次计算帖子的数量。这是一些伪代码:

    const count = await posts.count({userId, createdAt: {$gte: startOfDay}});
    // alternative: const count = await posts.count({userId, _id: {$gte: startofDayConvertedToMongoId});
    if (count > 3) throw new Error("no more posts for you");
    await posts.create(newPost)
    

    (注意:如果您担心竞争条件,任何您选择的解决方案都需要检查事务中的计数)

    如果您有一个以{userId: 1, createdAt: 1} 开头的索引,或者如果您使用_id 而不是{userId: 1, _id: 1}(假设您不允许客户端_id 创建),这些查询将非常便宜,并且他们很难不同步。

    单独的缓存集合

    即使您决定缓存这些创建值,我还是建议您将它们从用户的集合中缓存起来,以使您的集合更加集中。您可以创建一个post_count 集合,然后仅更新这些计数的缓存集合:post_count.updateOne({userId, day}, {$incr: {count: 1}, $setOnInsert: {day, userId, count: 0}}, {upsert: true});。这种方法的一个好处是您可以在day 上使用ttl 索引,让mongo 在此集合中的旧文档过期后自动删除它们。

    【讨论】:

      【解决方案2】:

      由于您使用的是 MongoDB,我建议您,

      1. 使用 agenda 并创建在 UTC 00:00(如果您有来自不同时区的不同用户)或特定于您用户所在国家/地区的时区运行的作业。
      2. 在此作业中,调用user 模型上的updateMany 函数以重置dailyPostLimit 字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 2014-03-17
        • 2011-07-19
        • 2012-01-25
        相关资源
        最近更新 更多