MongoDB学习笔记
简单概念
MongoDB是一个介于关系型数据库和非关系型数据库之间的数据库产品,它存储的数据格式是BSON(JSON的二进制存储格式),mongoBD中的文档是它的一个存储单位,通过这种文档可以实现关系型数据的功能。
MongoDB中的一些概念可以对照MySQL的概念来理解
mysql | mongoDB |
---|---|
数据库 | 数据库 |
表 | 集合 |
行 | 文档 |
列 | 字段 |
主键 | _id |
索引 | 索引 |
关系型数据库中典型的应用表连接的功能,在mongo中可以通过聚合操作来实现。
以上这些概念只是为了辅助快速理解mongodb,实际上还是有不同的,MongoDB是半结构化的存储,表的结构很松散,一个文档的字段并不是必须的,而且还支持嵌套和数组,从这点上来说,可以和面向对象完美契合,一个文档就是一个典型的对象。
MongoDB在支持的数据量,以及高并发时,要优于mysql
安装
官网:https://www.mongodb.com/try/download/community
1、在linux上安装,直接下载一个tar.gz的包,放在一个目录下,解压就好,为了方便再配置一个环境变量,不过不配也没关系,基本上不会通过命令行操作
2、创建两个目录
#创建dbpath和logpath
mkdir -p /mongodb/data /mongodb/log
3、启动服务端
#进入mongodb目录,启动mongodb服务
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork
--dbpath :指定数据文件存放目录
--logpath :指定日志文件,注意是指定文件不是目录
--logappend :使用追加的方式记录日志
--port:指定端口,默认为27017
--bind_ip:默认只监听localhost网卡
--fork: 后台启动
--auth: 开启认证模式
到这里其实就可以在项目中连接使用了
如果敲命令,可以进入Mongo shell
bin/mongo localhost:27017
然后就会进入类似mysql命令行的那种环境,里面可以执行mongodb的命令。
基本语法
#查看所有库
show dbs
# 切换到指定数据库,不存在则创建
use test
# 删除当前数据库
db.dropDatabase()
#查看集合
show collections
#创建集合
db.createCollection("emp")
#删除集合
db.emp.drop()
#插入,db.后跟的是自己创建的集合名
db.emp.insertOne()
db.emp.insertMany()
#查询
db.emp.find(query, projection)
#条件查询,这里的tag,type,num都是文档中的字段
db.emp.find({tag:"xxx"})
db.emp.find({type:"xxx",num:{$gt:60}})
#指定按num降序返回
db.emp.find({tag:"xxx"}).sort({num:-1})
# 分页
db.emp.find().skip(8).limit(4)
#使用正则
db.emp.find({type:{$regex:"test"}})
#更新文档,默认只更新一个文档,如果要更新多个,加{"multi":true}
db.emp.update(query,update,options)
db.emp.update({type:"test"},{$set:{date:new Date()}},{"multi":true})
#删除
db.emp.remove({age:{$lt:25}}) // 删除age 小于25的记录
db.emp.remove( { } ) // 删除所有记录
db.emp.remove() //报错
查询逻辑运算符:
lte: 存在并小于等于
gte: 存在并大于等于
in: 存在并在指定数组中
or: 匹配两个或多个条件中的一个
$and: 匹配全部条件</pre>
更新操作符
操作符 | 格式 | 描述 |
---|---|---|
$set | {$set:{field:value}} | 指定一个键并更新值,若键不存在则创建 |
$unset | {$unset : {field : 1 }} | 删除一个键 |
$inc | {$inc : {field : value } } | 对数值类型进行增减 |
$rename | {$rename : {old_field_name : new_field_name } } | 修改字段名称 |
$push | { $push : {field : value } } | 将数值追加到数组中,若数组不存在则会进行初始化 |
$pushAll | {$pushAll : {field : value_array }} | 追加多个值到一个数组字段内 |
$pull | {$pull : {field : _value } } | 从数组中删除指定的元素 |
$addToSet | {$addToSet : {field : value } } | 添加元素到数组中,具有排重功能 |
$pop | {$pop : {field : 1 }} | 删除数组的第一个或最后一个元素 |
数据可靠性
mongoDB保证数据可靠性的机制包括两个部分:
1、CheckPoint(检查点)机制
每隔一段时间在内存中建立一个快照数据,这一阶段的数据都在内存中,定时持久化,默认是60s
2、Journal日志
将每个写操作写入journal缓冲区,每隔100ms写入到日志中,这样即使是特殊情况下,也最多会丢失100ms的数据。
springboot整合mongodb
只要开发过项目,在springboot中整合过mysql,再来整合mongodb真的就太简单了。
三步:
1、引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
2、添加配置,application.yaml,
spring:
data:
mongodb:
uri: mongodb://192.168.17.100:27017/student
3、代码中注入MongoTemplate,调用它的CRUD的方法
@Autowired
private MongoTemplate mongoTemplate;
// 新增
public void save(@PathVariable("name") String name){
System.out.println("测试mongodb保存数据");
Student student = new Student();
student.setName(name);
student.setAddress("北京");
student.setAge(16);
student.setGender("男");
List<String> hobby = Arrays.asList("打球","打游戏","骑车");
student.setHobby(hobby);
// Student save = mongoTemplate.save(student);
// System.out.println("保存成功save:" + save);
Student insert = mongoTemplate.insert(student);
System.out.println("保存成功insert:" + insert);
}
// 查询
public void readAll(){
List<Student> studentList = mongoTemplate.findAll(Student.class);
System.out.println("查询mongodb列表:" + studentList);
}
public void queryById(@PathVariable("id") String id){
Student stu = mongoTemplate.findById(id, Student.class);
System.out.println("查询mongodb by id: " + stu);
}
public void query(){
Query query = new Query(Criteria.where("name").is("zhangsan").and("age").is(16));
List<Student> studentList = mongoTemplate.find(query, Student.class);
System.out.println("根据条件查询mongodb: " + studentList);
}
// 使用正则查询
public void queryRegex(){
String reg = ".san.";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<Student> studentList = mongoTemplate.find(query, Student.class);
System.out.println(studentList);
}
// 分页
public void page(){
int pageNo = 1;
int pageSize = 10;
Query query = new Query();
List<Student> studentList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), Student.class);
}
// 修改
public void update(){
Query query = new Query(Criteria.where("_id").is("xxx"));
Update update = new Update();
update.set("name", "tom+++");
update.set("age", 22);
UpdateResult upsert = mongoTemplate.upsert(query, update, Student.class);
}
// 删除
public void delete(){
Query query = new Query(Criteria.where("_id").is("xxx"));
DeleteResult remove = mongoTemplate.remove(query, Student.class);
}
Spring Data提供了对mongodb数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了,其实具体语法在用到的时候查文档:https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html
@Autowired
private StudentRepository studentRepository;
// 查询
public void findByRepository(){
List<Student> all = studentRepository.findAll();
System.out.println("通过repository查询" + all);
}
......