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

  <强> Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。

<强>评论榜预期的功能

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

<强>数据结构

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

<强>问题/评论实体如下

公共类问题实现了Serializable {
  @ id
  私人字符串_id;//关键
  私人字符串昵称;//用户名
  私人字符串avator;//用户头像
  私人字符串标识;//户名id
  私人字符串标题;//标题
  私人字符串内容;//内容
  私人布尔回答说;//是否已经回答
  私人createTime日期;//创建时间
  私人布尔标志=false;//标记是否是本人,默认是非本人
  私人ListanswerList;//问题的回答列表
  }

<>之前公开课回答{   私人字符串id;//当前回答的唯一标识   私人字符串昵称;//用户名   私人字符串avator;//用户头像   私人整数标识;//回答的用户的id   私人字符串内容;//回答的内容   私人约会时间;   私人布尔标志=false;//默认假的。不是本的人   私人整数集团;//分组的标记   }

<>强思路

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

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

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

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

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

公共JsonResult problemDetail (@PathVariable字符串problemId) {
  OptionalbyId=problemRepository.findById (problemId);
  如果(! byId.isPresent ()) {
  返回JsonResult.fail(“您没有获取到详情页,请联系管理员”);
  }
  问题问题=byId.get ();
  如果(problem.getAnswerList () .size()在0){
  Map<整数,List,列表=new ArrayList<的在();
  collect.forEach ((k、v)→{
  list.addAll (v);
  });
  problem.setAnswerList(列表);
  }
  返回JsonResult.ok(“返回详情页”+问题);
  }

<>强定位出当前用户的评论

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

<强>局限性

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


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