这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
前言
迫于大数据的前提,Mysql已经撑不住大的数据压力了。本身存储的关系已经开始变得越来越庞大,转战orcle还是搭建Mysql集群,亦或是加入新的MongoDB?
MongoDB的来源
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);
我这里实现的是一个根据日期来筛选历史数据的一个查询。
总结
-
mongoDB是一个非关系型数据库,但是又长得像关系型数据库
-
mongDB使用mongoTemplate可以增加工作效率
-
mongoDB多条件也是需要一个条件构造器的