我们有用户和新闻模型,在新闻模型中有一个viewsCount
字段,当一个GET
发出一个User
请求时,我想增加此视图计数。 / p>
当特定用户发出GET
请求时,视图计数将增加1,每个用户仅一个视图。
const NEWSModel = new Schema({
viewesCount: { type: Number },
Publisher: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
},
LikesCount: { type: Number },
DislikeCount: { type: Number },
Comments: CommenTs
});
每个用户可以根据需要多次查看新闻,但只能进行一次查看。我该怎么办?
答案 0 :(得分:0)
如果用户不多,则可以将其他字段添加到新闻模型中,例如users_viewed
,它将是唯一的用户ID数组。
并在增加视图计数之前进行其他检查。
如果请求新闻的用户已经在此users_viewed
数组中,则跳过任何其他操作。
如果没有,请增加视图计数器。
但是,如果确实有很多用户,最好将视图计数器存储在Redis中,以跳过对数据库的请求并在内存计数器中递增。
存储和显示数据的逻辑是相同的,但是您将减少数据库的负载并加快整个过程。
[UPDATE] 根据您的评论,关于用户数。
要使事情正常进行,您可以使用this package。
首先,在从客户端请求新闻之后,您可以将所有新闻数据存储在缓存中(以减少对数据库的请求数量)。
现在,您几乎没有办法处理大量视图。
我认为,最容易实现的方法是将用户唯一标识符添加到SET。并使用SCARD返回SET中的用户数;
在此解决方案中,您不需要检查用户是否已经看过新闻,因为set数据结构仅包含唯一值(与我们需要使用用户唯一标识符的相同原因相同)。
而且您只使用了2个redis请求,这对重负载服务非常有用。
答案 1 :(得分:0)
您可以拥有另一个名为viewedBy
的字段array
,您可以在其中存储用户ID。这样,检查用户是否已经查看过您的帖子或对其进行计数就变得更加容易。
文件: news.model.js
const News = new Schema({
viewedBy: [{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}],
// other properties...
});
文件: news.controller.js
const user = User.find({...}); // get current user
const news = News.find({...}); // get a news
/*
Update views count by adding the current user id if it's not already added
Thanks to '$addToSet', the update() function will do nothing if the user id it's already there)
*/
news.update({ $addToSet: { viewedBy: user._id } });
// Getting the views count
console.log('Total views:', news.viewedBy.length);
有关$addToSet
的更多信息:https://docs.mongodb.com/manual/reference/operator/update/addToSet/
答案 2 :(得分:0)
您可以像这样更改模型,然后每当收到新闻时,只需将用户ID推送到visibleBy字段即可。
news.viewedBy.push(用户ID)
viewedBy: [{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}]
}); ```