通过浏览他/她的所有帖子 MongoDB 获取该用户收到的总喜欢数
Posted
技术标签:
【中文标题】通过浏览他/她的所有帖子 MongoDB 获取该用户收到的总喜欢数【英文标题】:Getting total number of likes that user received by going through all his/her posts MongoDB 【发布时间】:2021-07-06 13:30:41 【问题描述】:我目前正在使用 MERN 堆栈来创建一个简单的 SNS 应用程序。
但是,我在尝试提出一个可以遍历用户发布的所有帖子并获得喜欢总和的查询时遇到了困难。
目前我已经创建了 3 个架构。用户、帖子、回复。
用户
const userSchema = new Schema(
facebookId:
required: true,
type: String,
,
username:
required: true,
type: String,
,
joined: Date
)
发布
const postSchema = new Schema(
title: String,
body: String,
author: type: Schema.Types.ObjectId, ref: "User" ,
datePosted: Date,
reply: [ type: Schema.Types.ObjectId, ref: 'Reply'],
tag: [ type: String ]
);
回复
const replySchema = new Schema(
title: String,
body: String,
author: type: Schema.Types.ObjectId, ref: "User" ,
datePosted: Date,
post: [ type: Schema.Types.ObjectId, ref: 'Post'],
likes: [ type: Schema.Types.ObjectId, ref: "User" ] // storing likes as array
);
如您所见,我在回复模式中添加了 likes 字段作为一个数组,该数组接受用户 ObjectId。 假设某个用户发布了 4 个回复,每个回复分别收到 1、3、4、5 个赞。在排行榜部分,我想显示用户信息以及他们从所有回复中收到的总计数,即 1+3+4+5 = 13 个赞。
是否可以在不添加额外字段的情况下实现这一点,或者是否有更好的方式来构建架构。
【问题讨论】:
【参考方案1】:您可以使用模型聚合函数来做到这一点:
const userid = 1234
post.aggregate([
$match: _id: userid ,
$lookup:
from: 'Reply',
localField: 'reply',
foreignField: '_id',
as: 'replies'
,
$group:
_id: false,
sumoflikes: $sum: '$replies.likes'
])
结构如下:
-
从具有“userid”的用户那里获取所有帖子
使用“回复”加入表格
总结所有的reply.likes
(可能是您需要输入 $unwind: '$replies between 2 到 3,我不是 100% 确定)
【讨论】:
【参考方案2】:如果此字段要公开显示,那么我个人建议不要即时计算,而是预先计算它并将其保存给用户,因为聚合数据的成本很高,并且不应该成为应用逻辑的一部分,特别是如果需要为每个用户计算 leaderboard
功能。
说到这里,你可以用aggregation framework计算它
db.replies.aggregate([
$match:
author: userid
,
$group:
_id: null,
likes: $sum: $size: '$likes'
]);
正如我所说,我建议您离线执行此操作,为每个用户运行一次并在用户上保存一个 likeCount
字段,然后您可以更新您的其他路线,其中创建了一个类似以更新用户喜欢计数使用 @ 987654322@.
// .. new like created ...
db.users.updateOne(_id: liked_reply.author, $inc: likeCount: 1)
现在查找排行榜非常简单:
const leaders = await db.users.find().sort(likeCount: -1).limit(10) //top 10?
【讨论】:
谢谢。所以每次有人按下一个like按钮时,我只需要在回复数组中添加用户ID+使用以下查询更新用户喜欢Count吗? db.users.updateOne(_id: like_reply.author, $inc: likeCount: 1 是的,这是正确的,预处理的小缺点以上是关于通过浏览他/她的所有帖子 MongoDB 获取该用户收到的总喜欢数的主要内容,如果未能解决你的问题,请参考以下文章
如何获取用户 ID 并以 Angular 6 的形式返回他的帖子及其评论