千家信息网

教你如何用 MongoDB 实现评论榜功能

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。评论榜预期的功能就像是StackOverFlow的
千家信息网最后更新 2026年10月31日教你如何用 MongoDB 实现评论榜功能
Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。

评论榜预期的功能

就像是StackOverFlow的那样, 用户可以发出自己的提问,其他用户来解答, 同时楼主可以回复别人的评论,别人依然可以回复楼主

数据结构

mongodb可以存储文档啊, 其实我们要做的就是构建一个合适的类,评论帮也就成功一大半了

问题/ 评论 实体如下

问题

public class Problem implements Serializable {@Idprivate String _id;// keyprivate String nickname; // 用户名private String avator; // 用户头像private String userId; // 户名idprivate String title ; // 标题private String content ;  // 内容private boolean answered ; // 是否已经回答private Date createTime ; // 创建时间private boolean flag =false; // 标记是否是本人,默认是非本人private List answerList; // 问题的回答列表}

评论

public class Answer {    private String id;// 当前回答的唯一标识    private String nickname; // 用户名    private String avator; // 用户头像    private  Integer userId; // 回答的用户的id    private  String Content ; // 回答的内容    private  Date time;    private  boolean flag = false;// 默认false.不是本人    private  Integer group; // 分组的标记}

思路

Answer实体中,并没有添加一个集合用来存放Answer类型的实体,如果添加上这个集合的话,确实想法还不错,回复中有其他人对自己的回复,天生的树形结构,但是考虑到前端的渲染的难度加大,放弃了这种方案

问题的实体类中维护了一个回答的实体类的集合,所有针对楼主问题的回答实例全部放在这个集合中, 也包括楼主对问题回答者的回复, 还包含回答者对问题的回复

于是这样就仅仅存在两层,一个问题中维护着对这个问题的全部回复,前端渲染的难度大大降低,但是后来却来事了
用户查询一个问题的详情时,后端如何处理

当用户查询一个问题的详情时,后端拿着问题的id,去数据库中将问题的实例取出来,紧接着处理Answer集合,将按照时间排序的集合按照我们指定的方式分组,再按时间排序

按什么分组呢?

当时是按照不同的用户分组, 同一个用户的全部评论,已经楼主对它的回复,以及别人对它的回复都放在一起, 所以需要一个字段,group(我选的用户id), 专门存储分组的标志. 组内的实例再按照时间排序,这样整体的层次就划分好了

public JsonResult problemDetail(@PathVariable String problemId){    Optional byId = problemRepository.findById(problemId);    if (!byId.isPresent()){        return JsonResult.fail("您没有获取到详情页,请联系管理员");    }    Problem problem = byId.get();    if (problem.getAnswerList().size()>0){            Map> collect = problem.getAnswerList()            .stream().collect(Collectors.groupingBy(Answer::getGroup));            ArrayList list = new ArrayList<>();            collect.forEach((k,v)->{                list.addAll(v);            });            problem.setAnswerList(list);        }    return JsonResult.ok("返回详情页"+problem);}

定位出当前用户的评论

如果前端想在页面的分左右两部分展示自己的评论和别人的评论,就需要一个标记,既然上面都已经在遍历了,多加一个判断也无妨, 拿着前端提交过来的用户id和Answer中的userId比对, 如果相等,就把这个评论的flag标记为true, 前端根据这个标记区分, 从而给用户更多的权限,比如删除自己的评论

局限性

如果没个问题都像网易音乐那种,上万条评论,这样的话,估计就废了,虽然使用stream会快,但是也扛不住量啊, 但是数量小的话,还是可以接受的, 其实理想的状态是评论可以以分页的形式获取出来, 感觉才正宗。

郑州不孕不育医院:http://yyk.39.net/zz3/zonghe/1d427.html


用户 问题 评论 前端 实体 标记 楼主 分组 时间 详情 实例 排序 内容 回答者 头像 思路 数据 用户名 结构 编码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 蓝思科技飞鸽互联网 互联网与科技发展 互联网公司 科技公司 深圳互联网络科技有限公司 智慧科技互联网 互联网科技宣传片 互联网金融监管科技 深圳国际航运科技和互联网 天津腾达互联网科技有限公司 互联网科技的全部知识 朱啸虎曾投资哪些互联网科技企业 卓翼科技产业互联网合作 互联网第三次科技革命特征 深圳无忧互联网科技 九思连强互联网电子科技有限公司 普陀区互联网教育科技管理办法 国产互联网科技公司 张家口科技产业互联网平台 长沙易易互联网科技有限公司 平安好医生打造互联网科技医疗 有马互联网科技 有木互联网科技 银川新华互联网科技学校地址 南山科技园互联网公司有哪些 宜昌元轩互联网科技有限公司 深圳艾果互联网通讯科技 保险科技服务互联网营销体系 区块链结合互联网科技 互联网科技包装股份有限公司上市 科技和互联网行业的特点
0