微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过浏览他/她的所有帖子获得该用户收到的总点赞数 MongoDB

如何解决通过浏览他/她的所有帖子获得该用户收到的总点赞数 MongoDB

我目前正在使用 MERN 堆栈来创建一个简单的 SNS 应用程序。

然而,我在试图提出一个查询时遇到了困难,该查询可以通过用户发布的所有帖子并获得喜欢的总和。

目前我已经创建了 3 个架构。用户、发帖、回复

用户

  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' }
  } }
])

结构如下:

  1. 获取来自具有“userid”的用户的所有帖子
  2. 使用“回复”加入表格
  3. 汇总所有回复。喜欢

(可能是你需要加入 $unwind: '$replies between 2 and 3 there,我不是 100% 确定)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。