1. MongoDB简介
1.1 为什么评论要采用MongoDB存储
1). 评论数据量大
2). 文章的评论插入查询频繁
3). 文章评论数据价值并不是特别大
1.2 MongoDB介绍
MongoDB 是一个介于关系型数据库 与 非关系型数据库之间的一个数据库 ; MongoDB 的数据是存放在磁盘上的 , 以类似于json格式(bson)进行存储 ;
1.3 MongoDB特点
适合存储什么样的数据 :
数据价值不高的数据 ; -------------> MongoDB不支持事务的 ;
插入比较频繁的数据 ;
1.4 MongoDB体系结构
1.5 MongoDB数据类型
ObjectId : 通常用于MongoDB插入文档的主键 ;
插入文档时, 我们可以自己来指定注解 _id ; 如果我们在插入文档时没有自己手动指定, 那么MongoDB会自动帮我们生成一个_id 值(ObjectId);
2. MongoDB基本使用
2.1 安装
2.1.1 Windows系统MongoDB安装
1). 安装MongoDB
2). 创建一个目录 , 存储MongoDB数据的目录
D:/data
3). 启动
mongod.exe --dbpath=D:\data
4). 客户端连接
mongo.exe
默认连接的是本地 127.0.0.1:27017 端口的mongoDB
连接远程的MongoDB
mongo.exe 192.168.192.164
2.1.2 Docker环境部署MongoDB
docker run -id --name mongo -p 27017:27017 mongo
2.2 常用指令
2.2.1 数据库操作
1). show dbs -----------> 查看所有数据库
2). use mytest --------> 切换/创建数据库 (新创建的数据库, 没有集合, 不显示)
3). db -----------------> 查看当前所处数据库
4). db.dropDatabase() --> 删除当前所处数据库
2.2.2 集合操作
1). show collections --------------> 查看当前数据库所有集合 ;
2). db.collectionname.drop(); -----> 删除集合
3). db.createCollection(name); ----> 创建集合
2.2.3 文档操作
1). 插入与查询
1). db.user.insert({......}) ; ----------> 插入文档
2). db.user.find({......}); --------------> 查询文档
db.user.find({}); / db.user.find(); --> 查询所有
3). db.user.findOne();
4). db.user.find().limit(...); ------------> 返回前N条记录
5). db.user.find().limit(...).skip(...); ------------> 返回前N条记录
2). 修改删除
1). db.user.update(修改的条件 , 修改后的数据, [参数]); --------> 修改操作
db.user.update({"age":17},{"name":"Itcast"}); ------> 替换文档
db.user.update({"age":30},{$set:{"name":"MyCat"}}); ----> 修改指定字段 , 修改匹配到的一条记录
db.user.update({"age":30},{$set:{"name":"MyCat"}},{multi:true}); ----> 修改指定字段 , 修改匹配到的全部记录
2). db.user.remove(条件); ----------> 根据条件删除
db.user.remove(); -------------> 删除全部
3). db.user.count(条件); ------------> 聚合统计
使用$set修改器, 来修改数据, 默认只会修改匹配到的第一条记录 ; multi 默认值为 false
3). 复杂查询
1). 模糊查询
db.user.find({"name":/S/})
db.user.find({"name":/^S/})
db.user.find({"name":/S$/})
db.user.find({"name":/S/i})
2). 数字范围查询
db.集合名称.find({"field":{$gt:value}}) //大于:field>value
db.集合名称.find({"field":{$lt:value}}) //小于:field<value
db.集合名称.find({"field":{$gte:value}}) //大于等于:field>=value
db.集合名称.find({"field":{$lte:value}}) //小于等于:field<=value
db.集合名称.find({"field":{$ne:value}}) //不等于:field!=value
3). in , nin
db.集合名称.find({"age":{$in:[30,18]}}) ;
db.集合名称.find({"age":{$nin:[30,18]}}) ;
4). 多条件组装
db.集合名称.find({"age":{$and:[30,18]}}) ;
db.集合名称.find({$or:[{......}, {.....} , {.......}]}) ; --------> or 连接条件
db.集合名称.find({$and:[{......}, {.....} , {.......}]}) ; --------> and 连接条件
5). 投影查询(查询返回指定字段)
db.user.find({....}, {name:1,_id:0})
6). 排序
db.user.find().sort({age:1}) ----------> 按照age升序排序 ;
db.user.find().sort({age:-1})----------> 按照age降序排序 ;
4). inc
db.user.update({"age":"30"} , {$inc:{"age":1}});
2.3 图形化工具
3. MongoDB Java客户端
3.1 pom.xml
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.10.1</version>
</dependency>
</dependencies>
3.2 查询全部
MongoClient client = new MongoClient("192.168.192.164",27017);
MongoDatabase commentdb = mongoClient.getDatabase("commentdb"); //获取数据库
MongoCollection collection = commentdb.getCollection("comment"); //获取集合
FindIterable<Document> documents = comment.find(); //集合操作
//5. 解析结果集(打印)
for (Document document : documents) {
System.out.println("------------------------------");
System.out.println("_id:" + document.get("_id"));
System.out.println("content:" + document.get("content"));
System.out.println("userid:" + document.get("userid"));
System.out.println("thumbup:" + document.get("thumbup"));
}
3.3 代码重构
@Before
@Test
@After
3.4 根据条件查询
BasicDBObject bson = new BasicDBObject("_id", "1");
// 执行查询
FindIterable<Document> documents = comment.find(bson);
3.5 新增
@Test
public void test3() {
// 封装新增数据
Map<String, Object> map = new HashMap<>();
map.put("_id", "2");
map.put("content", "不明觉厉啊");
map.put("userid", "1019");
map.put("thumbup", 100);
// 封装新增文档对象
Document document = new Document(map);
// 执行新增
comment.insertOne(document);
}
@Test
public void test3() {
// 封装新增文档对象
Document document = new Document();
document.put("_id",3);
document.put("name","金毛狮王");
// 执行新增
comment.insertOne(document);
}
comment.insertMany(List); 批量插入
3.6 修改
@Test
public void test4() {
//创建修改的条件
BasicDBObject filter = new BasicDBObject("_id", "6");
//创建修改的值
BasicDBObject update = new BasicDBObject("$set", new Document("userid", "999"));
// 执行修改
comment.updateOne(filter, update);
}
@Test
public void test4() {
//创建修改的条件
Document filter = new Document("_id", "4");
//创建修改的值
Document update = new Document("$set", new Document("userid", "1000"));
// 执行修改
comment.updateOne(filter, update);
}
3.7 删除
@Test
public void test5() {
// 创建删除的条件
BasicDBObject bson = new BasicDBObject("_id", "6");
// 执行删除
comment.deleteOne(bson);
}
comment.deleteMany(…);
4. 文章评论实现
4.1 业务分析
技术 : SpringDataMongoDB 对MongoDB官方提供的java客户端 mongodb-driver的封装 ;
4.2 准备工作
1). pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2). application.yml
spring:
data:
mongodb:
host: 192.168.192.164
database: commentdb
3). 实体类
//@Document(collection = "comment") -----> 操作的实体类名与集合名称一致 ;
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;
4). Dao接口定义
public interface CommentRepository extends MongoRepository<Comment, String> {
}
上述接口就已经具备了基本的增删改查的功能 ;
4.3 查询
public List<Comment> findAll() {
List<Comment> list = commentRepository.findAll();//查询所有
return list;
}
public Comment findById(String commentId) {
Comment comment = commentRepository.findById(commentId).get();//根据ID查询
return comment;
}
Optional 类是JDK1.8之后出现 , 用来使NullPointerException 判定标准化 , 并显式的提醒程序员, 要来判定空指针 ;
public Comment findById(String commentId) {
//Comment comment = commentRepository.findById(commentId).get();
Optional<Comment> optional = commentRepository.findById(commentId);
if(optional.isPresent()){
return optional.get();
}
return null;
}
4.4 新增
public void save(Comment comment) {
//分布式id生成器生成id
String id = idWorker.nextId() + "";
comment.set_id(id);
//初始化点赞数据,发布时间等
comment.setThumbup(0);
comment.setPublishdate(new Date());
//保存数据
commentRepository.save(comment);
}
4.5 修改
public void updateById(Comment comment) {
//使用的是MongoRepository的方法
//其中save方法,主键如果存在,执行修改,如果不存在执行新增
commentRepository.save(comment);
}
4.6 删除
public void deleteById(String commentId) {
commentRepository.deleteById(commentId);
}
4.7 根据文章ID查询评论
SpringDataMongoDB 中提供的另外一种查询方式 : 方法命名规则查询 ;
方法命名规范 :
findBy[属性1][查询方式1] [And|Or] [属性2][查询方式2]
findByArticleid(...) ;
List<Comment> findByThumbupBetween(Integer from , Integer to);
代码实现:
//根据文章id查询文章评论数据
List<Comment> findByArticleid(String articleId);
官方文档: