MongoDB

1. MongoDB简介

1.1 为什么评论要采用MongoDB存储

1). 评论数据量大 
2). 文章的评论插入查询频繁 
3). 文章评论数据价值并不是特别大 

1.2 MongoDB介绍

MongoDB 是一个介于关系型数据库 与 非关系型数据库之间的一个数据库 ; MongoDB 的数据是存放在磁盘上的 , 以类似于json格式(bson)进行存储 ;

1.3 MongoDB特点

适合存储什么样的数据 :

​ 数据价值不高的数据 ; -------------> MongoDB不支持事务的 ;

​ 插入比较频繁的数据 ;

1.4 MongoDB体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KN4Lwv4l-1584151388659)(assets/image-20200312093601209.png)]

1.5 MongoDB数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73RfaWfY-1584151388660)(assets/image-20200312094406900.png)]

ObjectId : 通常用于MongoDB插入文档的主键 ;

插入文档时, 我们可以自己来指定注解 _id ; 如果我们在插入文档时没有自己手动指定, 那么MongoDB会自动帮我们生成一个_id 值(ObjectId);

2. MongoDB基本使用

2.1 安装

2.1.1 Windows系统MongoDB安装

1). 安装MongoDB

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LV2bjNwM-1584151388660)(assets/image-20200312101002968.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkPTSWTH-1584151388661)(assets/image-20200312101400890.png)]

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(条件); ------------> 聚合统计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yIsIzpf-1584151388661)(assets/image-20200312105621048.png)]

使用$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;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4m1IHVhm-1584151388663)(assets/image-20200312154002353.png)]

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);

官方文档:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hSatRw2-1584151388663)(assets/image-20200312164726002.png)]

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值