如何限制用户每日发帖限制 (MERN)
Posted
技术标签:
【中文标题】如何限制用户每日发帖限制 (MERN)【英文标题】:How to limit users daily post limit (MERN) 【发布时间】:2021-06-24 14:51: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 任务适合这里还是有更简单的方法来完成这个?
【问题讨论】:
【参考方案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,我建议您,
-
使用 agenda 并创建在 UTC 00:00(如果您有来自不同时区的不同用户)或特定于您用户所在国家/地区的时区运行的作业。
在此作业中,调用
user
模型上的updateMany 函数以重置dailyPostLimit
字段。
【讨论】:
以上是关于如何限制用户每日发帖限制 (MERN)的主要内容,如果未能解决你的问题,请参考以下文章