如何解决通过浏览他/她的所有帖子获得该用户收到的总点赞数 MongoDB
我目前正在使用 MERN 堆栈来创建一个简单的 SNS 应用程序。
然而,我在试图提出一个查询时遇到了困难,该查询可以通过用户发布的所有帖子并获得喜欢的总和。
用户
const userSchema = new Schema({
facebookId: {
required: true,type: String,},username: {
required: true,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,post: [{ type: Schema.Types.ObjectId,ref: 'Post'}],likes: [{ type: Schema.Types.ObjectId,ref: "User" }] // storing likes as array
});
如您所见,我在 Reply Schema 中添加了 likes 字段,作为接受 User ObjectId 的数组。 假设某个用户发布了 4 个回复,每个回复分别获得了 1、3、4、5 个赞。在排行榜部分,我想显示用户信息以及他们从所有回复中收到的总计数,即 1+3+4+5 = 13 个喜欢。
这是否可以在不添加额外字段的情况下实现,或者是否有更好的架构结构方式。
解决方法
如果这个字段要公开显示,那么我个人建议不要即时计算,而是预先计算它并将其保存在用户身上,因为聚合数据很昂贵,不应该成为应用程序逻辑的一部分,特别是如果需要为 leaderboard
功能的每个用户计算这一点。
说到这里,您可以使用 aggregation framework
db.replies.aggregate([
{
$match: {
author: userid
}
},{
$group: {
_id: null,likes: {$sum: {$size: '$likes'}}
}
}
]);
正如我所说的,我建议您离线执行此操作,为每个用户运行一次并在用户上保存一个 likeCount
字段,然后您可以更新其他创建喜欢的路由以更新用户喜欢计数使用 $inc。
// .. 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?
,
您可以使用模型聚合函数来做到这一点:
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”的用户的所有帖子
- 使用“回复”加入表格
- 汇总所有回复。喜欢
(可能是你需要加入 $unwind: '$replies between 2 and 3 there,我不是 100% 确定)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。