文档章节

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

x
 xiangyunyan
发布于 09/10 10:22
字数 1095
阅读 22
收藏 0
Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。
评论榜预期的功能

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

数据结构

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

问题/ 评论 实体如下
问题
public class Problem implements Serializable {
@Id
private String _id;// key
private String nickname; // 用户名
private String avator; // 用户头像

private String userId; // 户名id
private String title ; // 标题
private String content ;  // 内容
private boolean answered ; // 是否已经回答
private Date createTime ; // 创建时间
private boolean flag =false; // 标记是否是本人,默认是非本人
private List<Answer> 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<Problem> byId = problemRepository.findById(problemId);
    if (!byId.isPresent()){
        return JsonResult.fail("您没有获取到详情页,请联系管理员");
    }
    Problem problem = byId.get();
    if (problem.getAnswerList().size()>0){
            Map<Integer, List<Answer>> collect = problem.getAnswerList()
            .stream().collect(Collectors.groupingBy(Answer::getGroup));
            ArrayList<Answer> list = new ArrayList<>();
            collect.forEach((k,v)->{
                list.addAll(v);
            });
            problem.setAnswerList(list);
        }
    return JsonResult.ok("返回详情页"+problem);
}
定位出当前用户的评论

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

局限性

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

本文地址:https://www.linuxprobe.com/mongodb-talk.html

本文转载自:https://www.linuxprobe.com/mongodb-talk.html

x
粉丝 2
博文 177
码字总数 60975
作品 0
长沙
私信 提问
教你如何用 MongoDB 实现评论榜功能

导读 Mongodb很适合做这件事,api的调用仅仅是使用到了入门级别的CRUD,理清楚了思路,编码也会顺风顺水,所以你会发现我在这篇博客中说的比编码还多。 评论榜预期的功能 就像是StackOverFlow的那...

问题终结者
09/10
30
0
如何在Ubuntu 18.04 LTS上安装和配置MongoDB

如何在Ubuntu 18.04 LTS上安装和配置MongoDB IMCN 18分钟前暂无评论 阅读 9 次 MongoDB是一款非关系型数据库,提供高性能,高可用性和自动扩展企业数据库。 MongoDB是一个非关系型数据库,因...

IMCN
2018/05/05
0
0
探索 MongoDB

在本文中,您将了解 MongoDB ,这是一个开放源码、面向文档的数据库,使用 C++ 语言编写,它的特点是能够在生产环境随意扩展数据库。探索面向文档的数据库相比传统关系型数据库管理系统 (RDB...

IBMdW
2011/09/01
3.2K
3
福利丨MongoDB赎金事件的背后,DBA们该如何反思?

最近MongoDB赎金事件闹得沸沸扬扬,一些技术实践者的观点是,本次安全事件的根源不在MongoDB,可能在于不规范的操作和使用,而一些安全战略师则反驳这是意料之中的事故。对此,你怎么看?DBA...

DBAplus社群
2017/01/12
0
0
基于云数据库MongoDB版进行应用开发

MongoDB是一个基于分布式文件存储的数据库,在互联网、物联网、游戏、金融等领域被广泛采用。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是当前最流行的Nosql...

mcy0425
2018/09/14
33
0

没有更多内容

加载失败,请刷新页面

加载更多

如何倒放视频

很多视频通过倒放制作,可以到达不可思议的视觉效果。那这些神奇的倒放视频上如何制作的呢?其实制作方法非常的简单,下面就一起来看看如何倒放视频吧! 具体步骤如下: 第一步: 首先打开手...

白米稀饭2019
33分钟前
3
0
可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! **导读:**InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Ja...

阿里巴巴云原生
34分钟前
3
0
Mybatis 配置详解

完整配置 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.......

xiaolyuh
35分钟前
4
0
与Windows用户共享Mac文件

与 Windows 用户共享 Mac 文件 若要允许用户从 Windows 电脑连接到您的 Mac,请打开文件共享和启用 SMB 共享。 在 Mac 上设置文件共享 在 Mac 上,选取苹果菜单 >“系统偏好设置”,然后点按...

W_Lu
41分钟前
6
0
CaaS: 内容是新的基础设施 Content-as-a-Service

内容是每家企业的必争之地,根据 CMI 的数据报告,88% 的 B2B 企业每天至少产生一篇内容。内容正在成为新的基础设施,Content as a Service 可以被简单理解为一种 CMS(Content Management ...

Authing
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部