MongoDB简介

文章评论数据分析

相较于一般数据,文章评论一般有如下特点:

  1. 数据量巨大。通常评论量要比帖子、文章大很多
  2. 写入操作频繁。
  3. 价值较低。一般来说,我们的主要目标还是在帖子(文章)本身。

基于上述要求,很明显,我们的传统关系型数据库如mysql是不符合要求的,因此我们需要使用一款nosql数据库,这里我们使用MongoDB来进行评论管理。

MongoDB介绍

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

MongoDB特点

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  1. 面向集合存储,易存储对象类型的数据。
  2. 模式自由。
  3. 支持动态查询。
  4. 支持完全索引,包含内部对象。
  5. 支持查询。
  6. 支持复制和故障恢复。
  7. 使用高效的二进制数据存储,包括大型对象(如视频等)。
  8. 自动处理碎片,以支持云计算层次的扩展性。
  9. 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  10. 文件存储格式为BSON(一种JSON的扩展)。

MongoDB体系结构

MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。

  1. MongoDB 的文档(document),相当于关系数据库中的一行记录。
  2. 多个文档组成一个集合(collection),相当于关系数据库的表。
  3. 多个集合(collection),逻辑上组织在一起,就是数据库(database)。
  4. 一个 MongoDB 实例支持多个数据库(database)。
MongoDB 关系型数据库Mysql
数据库(database) 数据库(database)
集合(collections) 表(table)
文档(document) 行(row)

MongoDB数据类型

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

特殊说明:

  1. ObjectId

    ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

    • 前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
    • 接下来的 3 个字节是机器标识码
    • 紧接的两个字节由进程 id 组成 PID
    • 最后三个字节是随机数

    MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象,使用的时候为了保持查询效率的高效一般我们不动它。

  2. 时间戳

    BSON 有一个特殊的时间戳类型,与普通的日期类型不相关。时间戳值是一个 64 位的值。其中:

    • 前32位是一个 time_t 值【与Unix新纪元(1970年1月1日)相差的秒数】
    • 后32位是在某秒中操作的一个递增的序数

    在单个 mongod 实例中,时间戳值通常是唯一的。

  3. 日期

    表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。

MongoDB基本使用

Docker中安装MongoDB

在Linux虚拟机中创建mongo容器,命令如下:

docker run -id --name mongo -p 27017:27017 mongo

默认端口就是27017 (redis默认端口6379,mysql默认端口3306)

选择和创建数据库的语法格式:

use 数据库名称

如果数据库存在则选择该数据库,如果数据库不存在则自动创建。以下语句创建commentdb数据库:

use commentdb

评论功能实现

评论集合结构

专栏文章评论 comment
字段名称 字段含义 字段类型 备注
_id ID 文本
articleid 文章ID 文本
content 评论内容 文本
userid 评论人ID 文本
parentid 评论ID 文本 如果为0表示文章的顶级评论
publishdate 评论日期 日期
thumbup 点赞数 数字

需要实现以下功能:

  1. 基本增删改查API
  2. 根据文章id查询评论
  3. 评论点赞

项目中环境准备

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

添加配置文件

  data:
mongodb:
database: commentdb
host: 192.168.200.128

SpringDataMongoDB是SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodb-driver。

功能实现

创建实体类:

public class Comment implements Serializable {
@Id
private String _id;
private String articleid;
private String content;
private String userid;
private String parentid;
private Date publishdate;
private Integer thumbup;
//getter and setter....
}

尽管这个命名不符合规范,不过主键名称还是要叫_id

Dao接口:

不要和Mybatis的接口放一块

直接继承springdata提供的MongoRepository,可以使用其提供的增删改查

public interface CommentRepository extends MongoRepository<Comment, String> {
} //泛型分别为实体类和主键类型

Service:

@Service
public class CommentService {
@Autowired
private IdWorker idWorker;
@Autowired
private CommentRepository commentRepository; //根据id查询
public Comment findById(String id) {
return commentRepository.findById(id).get();
}
//查询所有
public List<Comment> findAll() {
return commentRepository.findAll();
}
//保存数据
public void save(Comment comment) {
String id = idWorker.nextId() + "";
comment.set_id(id);
//初始化数据
comment.setPublishdate(new Date());
comment.setThumbup(0);
commentRepository.save(comment);
}
//修改数据
public void update(Comment comment) {
commentRepository.save(comment);
}
//删除数据
public void deleteById(String id) {
commentRepository.deleteById(id);
}
}

一般来说,增删改这些操作直接继承的接口中的方法就够用了,但是查询方面,只有与主键相关的方法,想要根据其他属性查询就我们需要自己写一些方法,但是不需要我们自己去实现,只需要保持命名规范就行了

例如根据文章id查询评论,这里的文章id不是主键,需要我们自己写方法

编写Dao

public interface CommentRepository extends MongoRepository<Comment, String> {
//根据文章id查询评论列表
List<Comment> findByArticleid(String articleId);
}

这种findByArticleid的规范命名格式springdata会帮我们实现对应的方法

评论点赞

评论点赞无非是让点赞字段加一。这里要注意的是前往不要使用那种先查询出点赞数,在外面给它加一后再赋值回去的方法,这样并发处理的时候会出问题。因此我们需要让该字段自增一位就行了。

这里使用继承的接口就不行了,需要我们自己构造条件,使用MongoTemplate

@Autowired
private MongoTemplate mongoTemplate;
public void thumbup(String id) {
//修改条件
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
//修改的数据
Update update = new Update();
//在原来的基础上加一
update.inc("thumbup", 1);
mongoTemplate.updateFirst(query, update, "comment");
}

关于MongoTemplate的用法就难得讨论了,暂时会个自增就行了。

重复点赞问题

在上面的点赞问题处理中,我们并没有对点赞条件进行限制,这就意味着用户可以一直点赞。这显然是不合理的,因为首先想到的是我们还需要来存储用户对某一评论的点赞情况。

这一问题又是操作频繁、数据量大的数据处理,因此关系型数据库又排除在外,只能使用nosql了,这里只有一个点赞关系的数据要存储,为了追求高速度,我们使用redis存储点赞信息。

添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

docker中创建容器:

docker run -id --name=tensquare_redis -p 6379:6379 redis

默认端口6379

配置文件添加上配置:

  redis:
host: 192.168.200.128

修改Controller:

使用RedisTemplate操作redis

@Autowired
private RedisTemplate redisTemplate;
//评论点赞
@RequestMapping(value = "thumbup/{id}", method = RequestMethod.PUT)
public Result thumbup(@PathVariable String id) {
//模拟获取到了用户id
String userid = "123";
//在redis中查询用户是否已经点赞
Object result = redisTemplate.opsForValue().get("thumbup_" + userid + "_" + id);
//如果点赞不能重复点赞
if (result != null) {
return new Result(false, StatusCode.REMOTEERROR, "不能重复点赞");
}
//如果没有点赞,可以进行点赞操作
commentService.thumbup(id);
//保存点赞记录
redisTemplate.opsForValue().set("thumbup_" + userid + "_" + id, 1);
return new Result(true, StatusCode.OK, "点赞成功");
}

MongoDB评论管理的更多相关文章

  1. MongoDB基本管理命令

    MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中 可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由 ...

  2. NoSQL学习二:MongoDB基本管理命令

    MongoDB命令学习  一.MongoDB命令帮助 在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控: 这是MongoDB最上层 ...

  3. phpcms 内容——>评论管理 中添加 打开文章链接的 功能

    需要实现的功能:在后台管理系统中的 内容 下的——>评论管理  中添加 打开文章链接的 功能 1.数据库表是 v9_comment和v9_comment_data_1. v9_comment是被 ...

  4. MongoDB权限管理之用户名和密码的操作

    MongoDB默认是不需要输入用户名和密码,客户就可以登录的.但是出于安全性的考虑,我们还是要为其设置用户名和密码.本文主要介绍的是MongoDB权限管理之用户名和密码的操作,希望能对您有所帮助. 本 ...

  5. 开源 自由 java CMS - FreeCMS1.9 评论管理

    项目地址:http://code.google.com/p/freecms/ 评论管理 1. 评论管理 从左側管理菜单点击评论管理进入. 2. 评论审核 选择须要审核的评论,然后点击"审核& ...

  6. MongoDB——权限管理

    MongoDB--权限管理 MongoDB默认是没有权限验证的,但生产环境中,没有权限控制是很不安全的. 我们先不详谈太多概念,直接动手创建两个典型的账号: 超级管理员,类似sql server的sa ...

  7. 最佳的MongoDB客户端管理工具

    <最佳的MongoDB客户端管理工具> 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一个好的MongoD ...

  8. MongoDB基本管理命令 [转]

    MongoDB基本管理命令 linux下配置安装mongodb 10分钟玩转mongoDB 官网安装教程 使用命令行方式连接mongodb: mongo /admin -u用户名 -p密码  --连接 ...

  9. MongoDB账号管理及实践

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 目前蜂巢(云计算基础服务)MongoDB上已经有数十个实例,其中不少是企业用户或公司内部产品用户的.用户多了 ...

随机推荐

  1. TEB 、TIB、PEB--Vista 32

    TEB struct TEB typedef struct _TEB { NT_TIB NtTib; PVOID EnvironmentPointer; CLIENT_ID ClientId; PVO ...

  2. 技术分享PPT整理(二):C#常用类型与数据结构

    这篇博客起源于我对Dictionary.List.ArrayList这几个类区别的好奇,当时在改造公司的旧系统,发现很多地方使用了ArrayList,但我们平时用的多是泛型集合List,改造的时候要全 ...

  3. Python爬虫系列之爬取美团美食板块商家数据(二)

    今天为大家重写一个美团美食板块小爬虫,说不定哪天做旅游攻略的时候也可以用下呢.废话不多说,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: requests模块: argpar ...

  4. 【linux】系统编程-8-Socket

    目录 前言 11. 套接字 11.1 Socket简介 11.2 socket() 11.3 bind() 11.4 connect() 11.5 listen() 11.6 accept() 11. ...

  5. java例题_01 不死神兔!

    1 /*1 [程序 1 不死神兔] 2 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 3 程 ...

  6. Java常用类库与技巧

    Java异常 异常处理机制主要回答了三个问题 What:异常类型回答了什么被抛出 Where:异常堆栈跟踪回答了在哪抛出 Why:异常信息回答了为什么被抛出 Java的异常体系

  7. JavaWeb 补充(XML)

    XML 1. 概念:Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的. <user>  <student> 功能: 存储数据   ...

  8. MySQL数据库高级四:工具拾遗(视图)

    视图

  9. Docker下MySQL的安装

    1 概述 本文讲述了如何利用Docker去安装MySQL,以及MySQL自定义配置文件的相关设置. 2 安装Docker 首先安装Docker并开启服务: systemctl start docker ...

  10. 工作区和GOPATH

    工作区和GOPATH 1.特性: 1.1.5版本的自举(即用 Go 语言编写程序来实现 Go 语言自身) 2.1.7版本的垃圾回收器 2.GOROOT.GOPATH 和 GOBIN GOROOT:Go ...