认识MongoDB是什么(一)

665 阅读3分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

前言

迫于大数据的前提,Mysql已经撑不住大的数据压力了。本身存储的关系已经开始变得越来越庞大,转战orcle还是搭建Mysql集群,亦或是加入新的MongoDB?

MongoDB的来源

image.png Mongodb命名并非是以芒果命名,他的来源于英文单词 Humongous 中的 Mongo一词,寓意是庞大

MongoDB是一个非关系型的数据库,这个大家早已耳闻,比如其他非关系型数据库还有Redis、ES..但MongoDB与它们不同,MongoDB更像是一个关系型数据库,也就是Mysql。为什么这样说呢?解释这个之前我们先看下关系型数据库是如何存放数据的。

关系型数据库?不,是非关系型数据库

MySql的存储结构为 数据库 -> 表 -> 记录 -> 字段,而MongoDB的存储结构为 数据库 -> 集合 -> 文档 -> key,value键值对,有没有发现是不是很相像,其实他们是差不多相同的。数据库对应数据库,表对应集合,记录对应文档,字段对应Key,value。这样讲完可以很快的理解下面的结构。

还是不懂得话可以看下下面的例子有利于帮助理解 MongoDB的存储例子:

这是一个数据库内的 一个集合下的 文档,其中的key,value就是他的字段
{
   _id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [  
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES 
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

这个例子大家不难看出它是一个Json格式的,但其实他不是Json它是Bson格式,BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。

SpringBoot使用MongoDB

SpringBoot使用MongoDB非常简单,本身提供了对MongoDB的支,跟其他的一样老路子,先导入依赖。依赖都没有做个锤子

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.5.3</version>
</dependency>

在application.yml中添加配置

`spring
    data
        mongodb
            uri=mongodb://user:pwd@ip1:port1,ip2:port2/database`
            // // 后面填写用户名密码,这个取决于你的MongoDB是否有开启安全认证

实体类

@Data
@Document(collection = "wfpe_data_broken_detection")
public class BrokenDetection{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private Date addTime;
    
    private String sign;

    private Integer switcher;

    private Float data;

    private Long concentratorId;

    @Transient
    private String alarmInfo;


}

MongoTemplate的使用

注意!实体类一定要加@Document 注解,这样可以自动生成Mongodb数据库,从而与之对应

插入MongoDb

BrokenDetection data = new BrokenDetection();
data.set(...)
set字段名...等等

把对象存入mongodb
mongoTemplate.save(data);

查询Mongodb

Query query = new Query(
        Criteria
                .where(BrokenDetection.SIGN)
                    .is(sign) // is 是 =
                .and(BrokenDetection.CONCENTRATORID)
                    .is(concentratorId)
                .and(BrokenDetection.ADDTIME)
                    .gte(startTime) // gte 大于等于
                    .lte(endTime) // lte 小于等于
);
// 传入query条件, 传入实体类模板class
List<BrokenDetection> brokenDetections = mongoTemplate.find(query, BrokenDetection.class);

我这里实现的是一个根据日期来筛选历史数据的一个查询。

总结

  1. mongoDB是一个非关系型数据库,但是又长得像关系型数据库

  2. mongDB使用mongoTemplate可以增加工作效率

  3. mongoDB多条件也是需要一个条件构造器的